看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
数据分析前需要对不完善的数据进行整理,其中缺失值的处理是最重要的一个环节。今天的案例,我们以一种新的需求来完成缺失值的填充,看看 pandas 在这方面有哪些方便之处。
源数据如下,a 为分组,c 列有缺失值。
import pandas as pd
import io
data = '''
a b c
A 1 8
A 1 NaN
A 4 3
A 5 NaN
A 2 NaN
B 5 8
B 2 NaN
B 2 NaN
B 1 5
B 4 NaN
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
需求为按 a 列的分组,填充 c 中的缺失值,填充内容为 b 列对应的累加值。结果如:
'''
a b c
0 A 1 8.0
1 A 1 2.0
2 A 4 3.0
3 A 5 11.0
4 A 2 13.0
5 B 5 8.0
6 B 2 7.0
7 B 2 9.0
8 B 1 5.0
9 B 4 14.0
'''
我们先计算一个 b 列的关于 a 列分组后的累加值序列,最后利用 pandas Series 对齐的特性来赋值修改缺失值,从而完成填充。
先计算 b 列的关于 a 列分组后的累加值:
df.groupby('a').b.cumsum()
'''
0 1
1 2
2 6
3 11
4 13
5 5
6 7
7 9
8 10
9 14
Name: b, dtype: int64
'''
然后用 loc 取要修改的 c 列内容:
df.loc[df.c.isna(), 'c']
'''
1 NaN
3 NaN
4 NaN
6 NaN
7 NaN
9 NaN
Name: c, dtype: float64
'''
最后将之前的累加值赋值给选中的数据:
df.loc[df.c.isna(), 'c'] = df.groupby('a').b.cumsum()
我们看最终的结果:
df
'''
a b c
0 A 1 8.0
1 A 1 2.0
2 A 4 3.0
3 A 5 11.0
4 A 2 13.0
5 B 5 8.0
6 B 2 7.0
7 B 2 9.0
8 B 1 5.0
9 B 4 14.0
'''
这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:18 p.m. 标签:pandas python 缺失值