2016-10-13 9 views
2

私のデータフレームdataの数値列をPython 2.7で使用し、dataの別の列である日付のインデックスを持つ個別のオブジェクト(系列)にします。私はこれを行うときシリーズをインデックスとして設定する

new_series = pd.Series(data['numerical_column'] , index=data['dates']) 

はしかし、私はシリーズでNaN値の束を得る:

dates 
1980-01-31 NaN 
1980-02-29 NaN 
1980-03-31 NaN 
1980-04-30 NaN 
1980-05-31 NaN 
1980-06-30 NaN 
... 

なぜnumerical_data値がちょうど消えるのでしょうか?

私は最初のアプローチが失敗した理由が不思議ですが、次のことを実行することで明らかにこの目標を達成できることを認識しています。

new_series = data.set_index('dates')['numerical_column'] 
+0

jezraelは、この問題を解決する方法の完璧な答えを与えました。あなたの試みが失敗した理由を理解していることを確認するだけです.pandasオブジェクトをdataパラメータとして渡し、indexパラメータとともにpandasがdataパラメータをindexパラメータで再インデックスしようとします。 'data [' dates_column ']と同じです。reindex(data [' dates ']) 'このように記述すると、なぜより明白なのですか?あなたの価値は消えました。 'data ['numeric_column']'は、 'data ['dates']'で指定されたインデックスの値を持ちません。 – piRSquared

答えて

3

data['numerical_column']のインデックスを整列していないと問題があると思います。

だからvaluesによってnumpy arrayに変換必要があります。

new_series = pd.Series(data['numerical_column'].values , index=data['dates']) 

サンプル:

import pandas as pd 
import datetime 

data = pd.DataFrame({ 
'dates': {0: datetime.date(1980, 1, 31), 1: datetime.date(1980, 2, 29), 
      2: datetime.date(1980, 3, 31), 3: datetime.date(1980, 4, 30), 
      4: datetime.date(1980, 5, 31), 5: datetime.date(1980, 6, 30)}, 
'numerical_column': {0: 1, 1: 4, 2: 5, 3: 3, 4: 1, 5: 0}}) 
print (data) 
     dates numerical_column 
0 1980-01-31     1 
1 1980-02-29     4 
2 1980-03-31     5 
3 1980-04-30     3 
4 1980-05-31     1 
5 1980-06-30     0 

new_series = pd.Series(data['numerical_column'].values , index=data['dates']) 
print (new_series) 
dates 
1980-01-31 1 
1980-02-29 4 
1980-03-31 5 
1980-04-30 3 
1980-05-31 1 
1980-06-30 0 
dtype: int64 

しかしset_indexを持つ方法がよりよいですが、slowier:

#[60000 rows x 2 columns] 
data = pd.concat([data]*10000).reset_index(drop=True) 

In [65]: %timeit pd.Series(data['numerical_column'].values , index=data['dates']) 
1000 loops, best of 3: 308 µs per loop 

In [66]: %timeit data.set_index('dates')['numerical_column'] 
1000 loops, best of 3: 1.28 ms per loop 

検証

列のインデックスが同じインデックスを持っている場合、それは素敵な作品:

s = data.set_index('dates')['numerical_column'] 
df = s.to_frame() 
print (df) 
      numerical_column 
dates      
1980-01-31     1 
1980-02-29     4 
1980-03-31     5 
1980-04-30     3 
1980-05-31     1 
1980-06-30     0 

new_series = pd.Series(df['numerical_column'] , index=data['dates']) 
print (new_series) 
dates 
1980-01-31 1 
1980-02-29 4 
1980-03-31 5 
1980-04-30 3 
1980-05-31 1 
1980-06-30 0 
Name: numerical_column, dtype: int64 
関連する問題