看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
需求如下,参见需求示例,需要在源数据中填充缺失值,在类别列标示的AB两组数据中,每列每组只有一个有值的数据,需要按组将缺失值填充为这个值。
源数据:
'''
类别 col1 col2 col3
A NaN NaN NaN
A d NaN NaN
A NaN NaN NaN
A NaN c e
B NaN Y Z
B NaN NaN NaN
B X NaN NaN
'''
将以上源数据中的缺失值填充完成如下样子:
'''
类别 col1 col2 col3
0 A d c e
1 A d c e
2 A d c e
3 A d c e
4 B X Y Z
5 B X Y Z
6 B X Y Z
'''
由于要按组来处理数据,就需要用 Pandas 的 groupby 进行分组,分组后填充数据用 fillna,用 apply 调用函数来应用 fillna。由于 fillna 的填充方法没有取唯一非空值填充的方法,我们需要用 method='bfill'
先向后填充,再用 method='ffill'
向前填充,来完成所有缺失值位置的填充。
最终代码如下:
import pandas as pd
# 先复制以上源数据,读取剪贴板
df = pd.read_clipboard()
(
df.groupby('类别')
.apply(lambda x: x.fillna(method='bfill'))
.groupby('类别')
.apply(lambda x: x.fillna(method='ffill'))
)
# 结果为需求中的目标数据
如果是 pandas 2.2+ 版本,可以简写成:
(
df.groupby('类别')
.bfill()
.ffill()
)
还可以简写成:
# 一
(
df.groupby('类别')
.apply(lambda x: x.fillna(method='bfill').fillna(method='ffill'))
)
# 二
(
df.groupby('类别')
.apply(lambda x: x.fillna(method='bfill'))
.fillna(method='ffill')
)
更新时间:Aug. 18, 2024, 3:40 p.m. 标签:pandas python 缺失值