2016-05-25 3 views
2

Angenommen wir folgende Datenrahmen haben:Pandas: Wie resample ich den Datenrahmen so, dass jede Kombination vorhanden ist?

# data 
t = pd.to_datetime(pd.Series(['2015-01-01', '2015-02-01', '2015-03-01', '2015-04-01', '2015-01-01', '2015-02-01'])) 
g = pd.Series(['A', 'A', 'A', 'A', 'B', 'B']) 
v = pd.Series([12.1, 14.2, 15.3, 16.2, 12.2, 13.7]) 
df = pd.DataFrame({'time': t, 'group': g, 'value': v}) 

# show data 
>>> df 
     time group value 
0 2015-01-01 A  12.1 
1 2015-02-01 A  14.2 
2 2015-03-01 A  15.3 
3 2015-04-01 A  16.2 
4 2015-01-01 B  12.2 
5 2015-02-01 B  13.7 

Was ich am Ende haben möchte ist die folgende Datenrahmen:

>>> df 
     time group value 
0 2015-01-01 A  12.1 
1 2015-02-01 A  14.2 
2 2015-03-01 A  15.3 
3 2015-04-01 A  16.2 
4 2015-01-01 B  12.2 
5 2015-02-01 B  13.7 
6 2015-03-01 B  13.7 
7 2015-04-01 B  13.7 

Die fehlenden Beobachtungen in der Gruppe B hinzugefügt werden soll, und die Fehlende Werte sollten standardmäßig auf den zuletzt beobachteten Wert gesetzt werden.

Wie kann ich das erreichen? Danke im Voraus!

Antwort

1

Sie können pivot zum Umformen verwenden, ffillNaN (fillna mit Methode ffill) und umformen von unstack mit reset_index zur Vorlage:

print (df.pivot(index='time',columns='group',values='value') 
     .ffill() 
     .unstack() 
     .reset_index(name='value')) 

    group  time value 
0  A 2015-01-01 12.1 
1  A 2015-02-01 14.2 
2  A 2015-03-01 15.3 
3  A 2015-04-01 16.2 
4  B 2015-01-01 12.2 
5  B 2015-02-01 13.7 
6  B 2015-03-01 13.7 
7  B 2015-04-01 13.7 

ersten andere Lösung date_range von min und max Werten von time finden. Dann groupby mit resample von D mit ffill:

Hinweis:

Ich glaube, Sie Parameter vergessen format='%Y-%d-%m' in to_datetime, wenn letzte Zahl ist month:

t = pd.to_datetime(pd.Series(['2015-01-01', '2015-02-01', '2015-03-01', 
           '2015-04-01', '2015-01-01', '2015-02-01']), 
        format='%Y-%d-%m') 


idx = pd.date_range(df.time.min(), df.time.max()) 
print (idx)  
DatetimeIndex(['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04'], 
dtype='datetime64[ns]', freq='D') 

df1 = (df.groupby('group') 
     .apply(lambda x: x.set_index('time') 
     .reindex(idx)) 
     .ffill() 
     .reset_index(level=0, drop=True) 
     .reset_index() 
     .rename(columns={'index':'time'})) 

print (df1) 

     time group value 
0 2015-01-01  A 12.1 
1 2015-01-02  A 14.2 
2 2015-01-03  A 15.3 
3 2015-01-04  A 16.2 
4 2015-01-01  B 12.2 
5 2015-01-02  B 13.7 
6 2015-01-03  B 13.7 
7 2015-01-04  B 13.7 
+0

Dank! Auch für die Bereitstellung von zwei Lösungen. – Michael

Verwandte Themen