看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
处理缺失值是数据预处理中的一个重要步骤,这是因为许多机器学习算法不支持缺失值。以下是一些情况可能需要处理缺失值:
在这些情况下,需要对缺失值进行处理以确保数据的完整性和可用性。缺失值的处理方法需要根据具体情况来选择,可以使用删除、填充或者插值等方法来处理缺失值。
今天我们来完成一个比较特殊的例子,它的缺失值不是一个标量,而是在值的里边。
我们构造数据如下:
import pandas as pd
df = pd.DataFrame({'A': [[None, 1], [2, None], [None, 3], [4, 5]]})
df
'''
A
0 [None, 1]
1 [2, None]
2 [None, 3]
3 [4, 5]
'''
A 的结构为 [x, y] 这样的列表,其中一个有可能为缺失值,现在需求为增加一列 B,如果如果 x 不为 None 则用 x,否则用 y。
我们先将 A 用 apply() 方法转为 DataFrame,分别对应成为两列,缺失值在对应位置上为缺失值,我们接着用 fillna() 方法按向左进行填充,最后取最左边的列。
转为 DataFrame:
df.A.apply(pd.Series)
'''
0 1
0 NaN 1.0
1 2.0 NaN
2 NaN 3.0
3 4.0 5.0
'''
向左填充:
df.A.apply(pd.Series).bfill(axis=1)
'''
0 1
0 1.0 1.0
1 2.0 NaN
2 3.0 3.0
3 4.0 5.0
'''
取左边的列:
df.A.apply(pd.Series).bfill(axis=1)[0]
'''
0 1.0
1 2.0
2 3.0
3 4.0
Name: 0, dtype: float64
'''
最终增加到一列:
df.assign(B=df.A.apply(pd.Series).bfill(axis=1)[0])
'''
A B
0 [None, 1] 1.0
1 [2, None] 2.0
2 [None, 3] 3.0
3 [4, 5] 4.0
'''
这个代码整体为:
这段代码使用了 Pandas 库中的 assign() 方法。它的作用是在 DataFrame 中添加一个新列 "B",其中每个元素都是 "A" 列中对应行的第一个非空值。
具体来说,代码的执行过程如下:
df.A
获取 DataFrame 中的 "A" 列,它的类型应该是一个 Series 对象。df.A.apply(pd.Series)
将 Series 中的每个元素(应该是一个字符串)按照元素位置拆分成一个新的 DataFrame,其中每列对应一个元素。bfill(axis=1)
对新的 DataFrame 沿着列方向进行后向填充。这个操作会用该列后面最靠近的非空值填充该列的空值。[0]
取得填充后的 DataFrame 的第一列,它的类型应该是一个 Series 对象。df.assign(B=...)
将新的 Series 赋值给 DataFrame 的新列 "B",并返回一个新的 DataFrame。综上所述,这段代码的作用是将 DataFrame 中 "A" 列的每个元素按照字符拆分成多列,然后对这些新列进行后向填充,最终将填充后的第一个非空值作为新的一列 "B" 添加到 DataFrame 中。
(完)
更新时间:2024-08-18 16:12:57 标签:pandas python 缺失值