将带有熊猫的数据框折叠为每组一行

时间:2018-07-30 14:06:25

标签: python pandas pandas-groupby

我有一个像这样的数据框:

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)。

1 个答案:

答案 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
相关问题