看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本例将通过某列是否包含指定值,来对有此值整行进行修改,我们将利用 pandas 的多种方法来实现它,让你体验 pandas 的强大与灵活,也从中学习问题的解决思路。
数据如下,我们通过复制读取剪贴板让数据构造为 DataFrame:
# 数据
'''
A B C
3 2 1
3 2 1
大 2 1
3 2 1
3 2 1
'''
import pandas as pd
df = pd.read_clipboard()
df
# 略
以上数据列名分别是 A、B、C,每列都有数据,组成一个 DataFrame。需求是当 A 值为 "大" 时,修改对应行的 B、C 列的值,B 列替换成 "中",C 列替换成 "小"。
定义一个函数,由 apply() 按行调用进行修改替换:
def func(s: pd.Series):
if s.A == "大":
s.B = "中"
s.C = "小"
return s
else:
return s
df.apply(func, axis=1)
'''
A B C
0 3 2 1
1 3 2 1
2 大 中 小
3 3 2 1
4 3 2 1
'''
用 lambda 直接编写方法进行处理(按行处理,将结果设置为广播):
df.apply(lambda s: list('大中小') if s.A == "大" else s,
result_type='broadcast',
axis=1)
# ...
使用赋值的方法修改,先选择符合条件的行,然后对其赋值:
df[df.A == '大'] = list('大中小')
df
# ...
以上方法都可以实现需求。
在上例的基础上,我们对需求进行一下扩展。当A列值为「大」,同一行上一行的B列值为「中」,C 列值仍为「小」。特殊情况是当第 1 行(索引为 0) A的值为「大」时,B 列不变化,C 列仍为「小」。我们重新构造数据,完成一下这个需求:
# 数据
'''
A B C
大 2 1
3 2 1
大 2 1
大 2 1
3 2 1
3 2 1
'''
import pandas as pd
df = pd.read_clipboard()
df
# ...
# 定义处理函数
def func(df: pd.DataFrame):
df = df.copy().astype(str)
for i, r in df.iterrows():
if r.A == '大':
df.loc[i-1, 'B'] = '中'
df.loc[i, 'C'] = '小'
return df.query('index >= 0')
# 应用函数
df.pipe(func)
'''
A B C
0 大 2 小
1 3 中 1
2 大 中 小
3 大 2 小
4 3 2 1
5 3 2 1
'''
应对复杂逻辑,可以采用迭代修改的方法完成。
(完)
更新时间:Aug. 18, 2024, 3:55 p.m. 标签:pandas python 修改