python - 按组用下一个可用值替换 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]
})
解决方案
@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.bfill
withlimit
参数在这里也可以完美地工作。来自熊猫文档,它很好地简要介绍了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_index
将group
列添加到索引,使其唯一,并做一个简单的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
推荐阅读
- c - 多线程嵌入式软件中的原子操作
- python - 用字符串替换整数区间
- azure - 基于 blob 触发 VSTS/TFS 构建
- shell - 如何使用 getopts 声明一个不允许任何参数的选项
- python - 保持从 for loop pandas 返回的迭代项的索引
- javascript - 在 html 页面中显示文件内容会产生空字段
- spring-boot - 如何配置 Spring Boot 2 WebFlux 以使用 SSL?
- r - 根据因子中的数字对数据框中的数据进行排序
- vb6 - 在 Visual Basic 6.0 中使用 D-LINK dwm - 156 gsm 调制解调器发送短信
- java - 在使用 Web 视图的 onCreateView 期间,Android 应用程序未按预期设置变量