看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注: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分组处理数据,通过巧妙地移动非缺失值来处理每组内的缺失数据,而不是简单地删除或填充。这种方法保留了数据的原始顺序和完整性,同时最大化了有效数据的利用。代码最后还进行了一些清理操作,确保最终结果的质量。
(完)
更新时间:2024-08-18 16:23:06 标签:pandas python 缺失值 对齐