2017-07-04 3 views
1

Ich habe folgenden Datenrahmen:Python Pandas: pad Zeilen mit fehlenden/übersprungenen Datum

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

Ich würde das übersprungene Datum mag Pad mit my_count = 0, so dass der gepolsterten Datenrahmen wird wie folgt aussehen:

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 

Mit Ausnahme der Überprüfung des Datenrahmens Zeile für Zeile gibt es eine elegantere Möglichkeit, dies zu tun? Vielen Dank!

Antwort

2

erste Option 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 

2. Option reindex von date_range,

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' hat einen' fill_value' Parameter. Wenn du es verwendest, wirst du niemals 'nan' bekommen und es wird nicht geworfen um zu schweben. 'df.reindex (pd.date_range ('2017-01-01', '2017-01-08'), fill_value = 0)' – piRSquared

1

Wenn Werte von DatetimeIndex sind einzigartige Verwendung:

Sie asfreq oder reindex von min verwenden oder max Wert von index oder von ersten und letzten (wenn DatetimeIndex ist sortiert):

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 

Wenn DatetimeIndex nicht eindeutig bekommen sind:

ValueError: cannot reindex from a duplicate axis

Dann resample mit einigen Aggregatfunktion wie mean oder groupby mit Grouper müssen und zuletzt NaN s durch fillna ersetzen:

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

Danke! aber ich habe diesen Fehler: Asfreq() hat ein unerwartetes Schlüsselwort Argument 'fill_value' Irgendwelche Idee? – Edamame

+1

Was ist deine Pandas Version? Fehne mich in 'Pandas 20.0.2' es funktioniert perfekt. – jezrael

+0

Ich sehe. Ich habe Pandas 0.19.1 ... – Edamame

Verwandte Themen