看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在数据处理中,需要用一列值替换另外一列对应的值的场景有很多,本例我们就用 pandas 来实现相关的需求。
以下是一些需要列值替换的常见场景:
数据清洗:在数据清洗过程中,有时候需要将某些列中的错误或缺失值用另一列中的合适值来替换。例如,如果一个表格中有一个人员姓名列和一个人员编号列,但人员姓名列中存在拼写错误或缺失值,那么可以通过人员编号列中的数据来纠正或填充姓名列中的值。
数据转换:在将数据从一种格式或结构转换为另一种格式或结构时,可能需要用一列值替换另外一列对应的值。例如,如果将一个表格从一个数据库转移到另一个数据库,可能需要将某些列中的值进行重新映射或转换,以适应新数据库的结构。
数据分析:在进行数据分析时,有时候需要将某些列中的值进行重编码或重新分类。例如,如果有一个表格中的一个列包含了年龄数据,那么可以将这个列中的值按照一定的规则重新编码成多个类别,比如“儿童”、“青少年”、“成年人”等等。
数据可视化:在进行数据可视化时,有时候需要将某些列中的值进行替换或映射,以便更好地呈现数据。例如,如果一个表格中的一个列包含了某些产品的名称,那么可以将这个列中的值映射成该产品的图标或缩略图,以便更好地展示产品信息。
构造数据如下:
from io import StringIO
import pandas as pd
data = """
a b
a1
a2 b2
a3
a4 b4
"""
df = pd.read_csv(StringIO(data), sep=r'\s+')
df
# ...
希望将 b 列中不为空的值去替换 a 列对应位置的数据。最终结果如下:
'''
a b
0 a1 NaN
1 b2 b2
2 a3 NaN
3 b4 b4
'''
有两种思路,一种为根据 b 列,将 a 列对应位置的数据设置为空,然后对 b 列对应位置的数据填充。
另外一种为根据 b 列直接筛选出 a 列的数据,然后用 b 列赋值给这些位置。
第一种思路,我们用链式方法,代码如下:
(
df.assign(a=df.a.mask(df.b.notna()))
.apply(lambda s: s.bfill(), axis=1)
)
代码使用了 pandas 的 assign() 和 apply() 函数来操作数据框 df。下面是代码的具体解析:
df.assign(a=df.a.mask(df.b.notna()))
:该语句创建了一个新的数据框,其中列 a 的值根据列 b 是否为空来进行替换,即如果列 b 不是空值,则列 a 的值将会被替换为 NaN。其中 df.a.mask(df.b.notna())
使用了 pandas 的 mask() 函数来实现替换操作。
.apply(lambda s: s.bfill(), axis=1)
:该语句将对每行数据执行一个函数,使用 bfill() 函数来填充每行数据中的缺失值。其中 apply() 函数的第一个参数是一个函数,该函数会对每行数据进行操作,axis=1 参数表示对行进行操作。
综合来说,该行代码的作用是:将数据框 df 中列 a 中的空值替换为 NaN,并使用 bfill() 函数来填充每行数据中的缺失值。具体的数据处理过程为:首先将列 a 中的空值替换为 NaN,然后对每行数据执行 bfill() 函数来填充缺失值。
第二种思路为直接赋值修改,代码如下:
df.loc[df.b.notna(), 'a'] = df.b
这行代码使用了 pandas 的 loc 函数来修改数据框 df 中的值。下面是代码的具体解析:
df.b.notna()
:该语句返回一个布尔型的 Series,其中的每个元素表示该行数据中列 b 是否为非空值。如果是非空值,返回 True,否则返回 False。
df.loc[df.b.notna(), 'a']
:该语句选中了数据框 df 中所有满足条件 df.b.notna()
的行,并选中这些行中的列 a。
=
:该语句表示将选中的行和列的值进行修改。
df.b
:该语句表示使用列 b 中的值来替换选中行中的列 a 的值。
该行代码的作用是:将数据框 df 中所有满足条件 df.b.notna() 的行中的列 a 的值替换为该行中的列 b 的值。具体的数据处理过程为:首先选中所有满足条件 df.b.notna() 的行中的列 a,然后将这些行中的列 a 的值替换为该行中的列 b 的值。
这样都可以完成需求。
(完)
更新时间:Aug. 18, 2024, 4:12 p.m. 标签:pandas python 缺失值 替换