2017-01-05 3 views
2

Предположим, у меня есть разреженная DataFrame, и я хочу, .fillna(method='ffill'), но только на строки с одинаковой датой?Панды: DataFrame.fillna но только тот же день

Например, если df имеет строки:

2017-01-01 12:00 0.6 
2017-01-01 13:00 NaN 
2017-01-02 12:00 NaN 
2017-01-02 13:00 0.8 

Тогда я хочу, чтобы заполнить вперед, чтобы произвести:

2017-01-01 12:00 0.6 
2017-01-01 13:00 0.6 
2017-01-02 12:00 NaN 
2017-01-02 13:00 0.8 

Вот код, чтобы создать редкую почасовой DataFrame для демонстрации:

df = pd.DataFrame(np.random.rand(76), columns=list('X'), index=pd.date_range('2016-01-01', freq='H', periods=76)) 
df.loc[df['X'] < 0.6, 'X'] = np.nan 

ответ

5

Выполните groupby в день, затем позвоните по телефону ffill:

df = df.groupby(pd.TimeGrouper(freq='D')).ffill() 
+0

Вы знаете, почему 'resample ('D'). Ffill()' не удается? – ayhan

+2

@ayhan: Вы имеете в виду 'resample ('H')'? Не будет ли 'resample ('D')' downsample почасовые данные до ежедневного, так что это не будет действительно соответствовать? Из нескольких тестов я считаю, что 'resample ('H')' только форвард заполняется, если часы полностью отсутствуют. В этом случае все часы есть, некоторые просто имеют значение null. Я думаю, вам нужно сначала сбросить нули, чтобы он работал, что-то вроде 'df ['X'] = df ['X']. Dropna(). Resample ('H'). Ffill()'. – root

+0

Я думал, что 'ffill' заставит его работать как' groupby.transform', но вы правы. Спасибо. – ayhan

Смежные вопросы