看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas在处理缺失值方面提供了强大而灵活的功能。它能够轻松识别和统计缺失值,支持多种删除和填充方法,包括固定值填充、前向/后向填充、插值填充等。pandas还支持基于统计量的填充、分组填充、条件填充,以及针对时间序列数据的特殊处理。 本例我们来看一个不一样的缺失值处理需求。
构造数据如下:
import pandas as pd
import numpy as np
nan = np.nan
df = pd.DataFrame({'ID': ['id_1', 'id_1', 'id_1', 'id_1', 'id_1',
'id_1', 'id_1', 'id_1', 'id_2', 'id_2',
'id_2', 'id_2', 'id_2', 'id_2', 'id_2'],
'Label': ['A', 'B', 'C', 'D', 'E', nan, nan,
nan, 'F', 'G', 'H', nan, nan,
nan, nan],
'Value': [nan, nan, nan, nan, nan,
10, 20, 30, nan, nan, nan,
40, 50, 60, 70]})
df
'''
ID Label Value
0 id_1 A NaN
1 id_1 B NaN
2 id_1 C NaN
3 id_1 D NaN
4 id_1 E NaN
5 id_1 NaN 10.0
6 id_1 NaN 20.0
7 id_1 NaN 30.0
8 id_2 F NaN
9 id_2 G NaN
10 id_2 H NaN
11 id_2 NaN 40.0
12 id_2 NaN 50.0
13 id_2 NaN 60.0
14 id_2 NaN 70.0
'''
目标是始终将给定ID的“标签”列的第一个值与同一ID的“值”列的第二个值对齐,结果即:
'''
ID Label Value
0 id_1 A 10.0
1 id_1 B 20.0
2 id_1 C 30.0
3 id_1 D NaN
4 id_1 E NaN
8 id_2 F 40.0
9 id_2 G 50.0
10 id_2 H 60.0
11 id_2 NaN 70.0
'''
先按 ID 分组,然后将每个子 DataFrame 传入一个专门设计的用于处理这些子 DataFrame 的函数中。
这个函数先判断 value 列的缺失值并统计缺失值的数量,这个数据用来作为向上位移的量。
然后删除两列都为缺失值的行。
代码如下:
def func(d: pd.DataFrame) -> pd.DataFrame:
offset = -d.Value.isna().sum()
return d.assign(Value=d.Value.shift(offset))
(
df.groupby('ID')
.apply(func, include_groups=False)
.reset_index()
.drop('level_1', axis=1)
.dropna(subset=['Label', 'Value'], how='all')
)
'''
ID Label Value
0 id_1 A 10.0
1 id_1 B 20.0
2 id_1 C 30.0
3 id_1 D NaN
4 id_1 E NaN
8 id_2 F 40.0
9 id_2 G 50.0
10 id_2 H 60.0
11 id_2 NaN 70.0
'''
它按ID分组处理数据,通过巧妙地移动非缺失值来处理每组内的缺失数据,而不是简单地删除或填充。这种方法保留了数据的原始顺序和完整性,同时最大化了有效数据的利用。代码最后还进行了一些清理操作,确保最终结果的质量。
(完)
更新时间:Aug. 18, 2024, 4:23 p.m. 标签:pandas python 缺失值 对齐