熊猫:groupby 前向填充日期时间索引

新手上路,请多包涵

我有一个包含两列的数据集:公司和价值。

它有一个日期时间索引,其中包含重复项(在同一天,不同的公司有不同的值)。这些值缺少数据,所以我想用同一家公司的先前数据点向前填充丢失的数据。

但是,如果不遇到奇怪的 groupby 错误,我似乎无法找到一种好的方法来执行此操作,这表明我做错了什么。

玩具数据:

 a = pd.DataFrame({'a': [1, 2, None], 'b': [12,None,14]})
a.index = pd.DatetimeIndex(['2010', '2011', '2012'])
a = a.unstack()
a = a.reset_index().set_index('level_1')
a.columns = ['company', 'value']
a.sort_index(inplace=True)

尝试的解决方案(没有用: ValueError: cannot reindex from a duplicate axis ):

 a.groupby('company').ffill()
a.groupby('company')['value'].ffill()
a.groupby('company').fillna(method='ffill')

Hacky 解决方案(提供了预期的结果,但显然只是一个丑陋的解决方法):

 a['value'] = a.reset_index().groupby(
    'company').fillna(method='ffill')['value'].values

可能有一种简单而优雅的方法可以做到这一点,这在 Pandas 中是如何执行的?

原文由 sapo_cosmico 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 304
1 个回答

一种方法是使用 transform 函数在分组后填充 value 列:

 import pandas as pd
a['value'] = a.groupby('company')['value'].transform(lambda v: v.ffill())

a
#          company  value
#level_1
#2010-01-01      a    1.0
#2010-01-01      b   12.0
#2011-01-01      a    2.0
#2011-01-01      b   12.0
#2012-01-01      a    2.0
#2012-01-01      b   14.0

为了进行比较,原始数据框如下所示:

 #            company    value
#level_1
#2010-01-01        a      1.0
#2010-01-01        b     12.0
#2011-01-01        a      2.0
#2011-01-01        b      NaN
#2012-01-01        a      NaN
#2012-01-01        b     14.0

原文由 Psidom 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题