首页 > 解决方案 > 按组用下一个可用值替换 Python 中的空值

问题描述

df = pd.DataFrame({
    'group': [1,1,1,2,2,2],
    'value': [None,None,'A',None,'B',None]
})

我想按组用第一个下一个非缺失值替换缺失值。期望的结果是:

df = pd.DataFrame({
    'group': [1,1,1,2,2,2],
    'value': ['A','A','A','B','B',None]
})

标签: pythonpandaspandas-groupby

解决方案


@Erfan 提到的最简单的方法是使用回填方法DataFrameGroupBy.bfill

解决方案1)

>>> df['value'] = df.groupby('group')['value'].bfill()
>>> df
   group value
0      1     A
1      1     A
2      1     A
3      2     B
4      2     B
5      2   NaN

解决方案2)

DataFrameGroupBy.bfillwithlimit参数在这里也可以完美地工作。来自熊猫文档,它很好地简要介绍了Limit the amount of filling值得一读的内容。根据文档If we only want consecutive gaps filled up to a certain number of data points, we can use the limit keyword

>>> df['value'] = df.groupby(['group']).bfill(limit=2)
# >>> df['value'] = df.groupby('group').bfill(limit=2)
>>> df
   group value
0      1     A
1      1     A
2      1     A
3      2     B
4      2     B
5      2   NaN

解决方案 3)

withgroupby()我们也可以与 limit 参数结合fillna()使用。bfill()

>>> df.groupby('group').fillna(method='bfill',limit=2)
  value
0     A
1     A
2     A
3     B
4     B
5  None

解决方案4)

使用DataFrame.transform函数来填充value分组后的列的其他方法DataFrameGroupBy.bfill

>>> df['value'] = df.groupby('group')['value'].transform(lambda v: v.bfill())
>>> df
   group value
0      1     A
1      1     A
2      1     A
3      2     B
4      2     B
5      2  None

解决方案 5)

您可以使用DataFrame.set_indexgroup列添加到索引,使其唯一,并做一个简单的bfill()via groupby(),然后您可以使用将索引重置为其原始状态。

>>> df.set_index('group', append=True).groupby(level=1).bfill().reset_index(level=1)
   group value
0      1     A
1      1     A
2      1     A
3      2     B
4      2     B
5      2   NaN

解决方案 6)

如果严格不去,groupby()那么下面将是最简单的..

>>> df['value'] = df['value'].bfill()
>>> df
   group value
0      1     A
1      1     A
2      1     A
3      2     B
4      2     B
5      2  None

推荐阅读