2017-07-04 9 views
1

をスキップ欠落してパッド列Iは、次のデータフレームがあります。Pythonのパンダ:/日付

date  my_count 
-------------------------- 
2017-01-01   6 
2017-01-04   5 
2017-01-05   3 
2017-01-08   8 

を私はmy_count = 0とパッドスキップされた日付をしたいと思いますので、パディングされたデータフレームは、次のようになります。

date  my_count 
-------------------------- 
2017-01-01   6 
2017-01-02   0 
2017-01-03   0 
2017-01-04   5 
2017-01-05   3 
2017-01-06   0 
2017-01-07   0 
2017-01-08   8 

データフレームを1行ずつチェックする以外は、これを行うもっとエレガントな方法がありますか?ありがとう!

答えて

2

date_rangeによって第一選択肢resample

df['date'] = pd.to_datetime(df['date']) 
df = df.set_index('date') 

print(df.resample('D').sum().fillna(0).reset_index()) 

     date my_count 
0 2017-01-01  6.0 
1 2017-01-02  0.0 
2 2017-01-03  0.0 
3 2017-01-04  5.0 
4 2017-01-05  3.0 
5 2017-01-06  0.0 
6 2017-01-07  0.0 
7 2017-01-08  8.0 

第二オプションreindex

df['date'] = pd.to_datetime(df['date']) 
df = df.set_index('date') 

print(df.reindex(pd.date_range('2017-01-01', '2017-01-08')).fillna(0)) 

      my_count 
2017-01-01  6.0 
2017-01-02  0.0 
2017-01-03  0.0 
2017-01-04  5.0 
2017-01-05  3.0 
2017-01-06  0.0 
2017-01-07  0.0 
2017-01-08  8.0 
+1

'reindex'は' fill_value'パラメータを持っています。あなたがそれを使うならば、あなたは "nan"を得ることはありません。それは、キャストされずに浮かびます。 'df.reindex(pd.date_range( '2017-01-01'、 '2017-01-08')、fill_value = 0)' – piRSquared

1

DatetimeIndexの値が一意で使用している場合:

あなたはminまたはmaxによってasfreqreindexを使用することができますindexの値または最初と最後の値(DatetimeIndex)がソートされます。

df['date'] = pd.to_datetime(df['date']) 
df = df.set_index('date') 

print(df.asfreq('D', fill_value=0).reset_index()) 
     date my_count 
0 2017-01-01   6 
1 2017-01-02   0 
2 2017-01-03   0 
3 2017-01-04   5 
4 2017-01-05   3 
5 2017-01-06   0 
6 2017-01-07   0 
7 2017-01-08   8 

rng = pd.date_range(df.index.min(), df.index.max()) 
#alternative 
#rng = pd.date_range(df.index[0], df.index[-1]) 
print(df.reindex(rng, fill_value=0).rename_axis('date').reset_index()) 
     date my_count 
0 2017-01-01   6 
1 2017-01-02   0 
2 2017-01-03   0 
3 2017-01-04   5 
4 2017-01-05   3 
5 2017-01-06   0 
6 2017-01-07   0 
7 2017-01-08   8 

DatetimeIndexが一意でGETしていない場合:

ValueError: cannot reindex from a duplicate axis

が続いGroupermeanまたはgroupbyのようないくつかの集約関数でresampleを必要とし、最後fillnaNaN Sを置き換える:

print (df) 
     date my_count 
0 2017-01-01   4 <-duplicate date 
1 2017-01-01   6 <-duplicate date 
2 2017-01-04   5 
3 2017-01-05   3 
4 2017-01-08   8 

df['date'] = pd.to_datetime(df['date']) 

print(df.resample('D', on='date')['my_count'].mean().fillna(0).reset_index()) 
     date my_count 
0 2017-01-01  5.0 
1 2017-01-02  0.0 
2 2017-01-03  0.0 
3 2017-01-04  5.0 
4 2017-01-05  3.0 
5 2017-01-06  0.0 
6 2017-01-07  0.0 
7 2017-01-08  8.0 

df = df.set_index('date') 
print(df.groupby(pd.Grouper(freq='D'))['my_count'].mean().fillna(0).reset_index()) 
     date my_count 
0 2017-01-01  5.0 
1 2017-01-02  0.0 
2 2017-01-03  0.0 
3 2017-01-04  5.0 
4 2017-01-05  3.0 
5 2017-01-06  0.0 
6 2017-01-07  0.0 
7 2017-01-08  8.0 
+0

ありがとう!私はこのエラーが発生しました:asfreq()は予期しないキーワード引数 'fill_value'を持っていますか? – Edamame

+1

あなたのパンダのバージョンは何ですか?私を 'pandas 20.0.2'に入れてもらえれば完璧に動作します。 – jezrael

+0

を参照してください。私はパンダ0.19.1を持っています... – Edamame

関連する問題