我有一个像这样的数据框:
id A B date
a 1 NAN 2016-01-01
a NAN 6 2016-01-02
a 7 NAN 2016-10-01
b 3 5 2016-12-01
我想按日期和ID折叠(每个组转到一行,使用组中最后日期的数据,并用组中的最新数据填充缺失的数据)。该groupby大致如下所示:
df.groupby(['id', pd.Grouper(key='date', freq='30D')])
这将导致如下所示的数据框:
id A B date
a 1 6 2016-01-02
a 7 NAN 2016-10-01
b 3 5 2016-12-01
一个非常简单的例子。我相信我的groupby可以工作,但是我不确定如何将行合并为一行,并使用每列中的最新数据汇总数据,并在必要时转发填充数据(如果它们都是NAN,请使用NAN)。
答案 0 :(得分:2)
df.groupby(['id', pd.Grouper(key='date', freq='30D')]).apply(lambda g: g[["A", "B"]].ffill().iloc[-1])
结果:
A B
id date
a 2016-01-01 1 6.0
2016-09-27 7 NaN
b 2016-11-26 3 5.0
编辑:为了解决您的评论,如果您想避免使用apply
,还可以使用两个groupby
:
groupers = ['id', pd.Grouper(key='date', freq='30D')]
df.groupby(groupers).ffill().groupby(groupers).last()
结果:
A B
id date
a 2016-01-01 1 6
2016-09-27 7 NaN
b 2016-11-26 3 5
性能似乎类似于apply
:
In [1]: groupers = ['id', pd.Grouper(key='date', freq='30D')]
In [2]: %%timeit
...: df.groupby(groupers).ffill().groupby(groupers).last()
...:
100 loops, best of 3: 9.79 ms per loop
In [3]: %%timeit
...: df.groupby(groupers).apply(lambda g: g[["A", "B"]].ffill().iloc[-1])
...:
100 loops, best of 3: 10.5 ms per loop