看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 pandas 中,case_when 的概念与 SQL 中的 CASE WHEN 类似,这样的条件替换可以帮助你根据数据的特定条件生成新的列,使得数据更容易理解和处理。这个功能是 pandas 2.2 新增加的功能。
示例如下:
import pandas as pd
df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6]))
df
'''
a b
0 1 4
1 2 5
2 3 6
'''
ser = pd.Series('default', index=df.index)
ser
'''
0 default
1 default
2 default
dtype: object
'''
# 条件替换
ser.case_when(
caselist=[
(df.a == 1, 'first'), # condition, replacement
(df.a.gt(1) & df.b.eq(5), 'second'), # condition, replacement
],
)
'''
0 first
1 second
2 default
dtype: object
'''
另外一个例子:
c = pd.Series([6, 7, 8, 9], name='c')
a = pd.Series([0, 0, 1, 2])
b = pd.Series([0, 3, 4, 5])
c.case_when(caselist=[(a.gt(0), a), # condition, replacement
(b.gt(0), b)])
'''
0 6
1 3
2 1
3 2
Name: c, dtype: int64
'''
如果写一个 else,如果没有特殊值,else 条件可以用 ser == ser 来表示,或者直接构造一个等长的值全为 True 的布尔序列。或者用下例的办法:
pd_df["difficulty"] = "Unknown"
pd_df["difficulty"] = pd_df["difficulty"].case_when([
(pd_df.eval("0 < Time < 30"), "Easy"),
(pd_df.eval("30 <= Time <= 60"), "Medium"),
(pd_df.eval("Time > 60"), "Hard")
])
pandas 2.2 已添加 Series.case_when() 函数,用于根据一个或多个条件创建一个 Series 对象:
Series.case_when(caselist)
替换条件为True的值。
caselist 是一个元组的列表,每个元组包含条件和预期替换值。其形式为:(condition0, replacement0), (condition1, replacement1), …
。其中,condition 应该是一个一维的布尔数组或类似的对象,或者是一个可调用对象(传入的是这个 Series)。如果 condition 是一个可调用对象,它会在这个 Series 上计算,并应返回一个布尔 Series 或数组。这个可调用对象不能改变输入的 Series,尽管 pandas 不会检查这一点。replacement 应该是一个一维的类数组对象、标量或可调用对象。如果 replacement 是一个可调用对象,它会在 Series 上计算,并应返回一个标量或 Series。这个可调用对象不能改变输入的 Series,尽管 Pandas 不会检查这一点。
形式为:(condition0, replacement0), (condition1, replacement1), …
。条件应该是类似于一维布尔数组的对象或可调用对象。如果条件是可调用的,则它是在这个 Series 上计算的,并且应该返回布尔Series 或数组。可调用程序不能更改输入序列(尽管pandas不检查它)。替换应该是类似于一维数组的对象、标量或可调用对象。如果替换是可调用的,则它是在Series上计算的,并且应该返回标量或Series。可调用程序不能更改输入序列(尽管pandas不检查它)。
更新时间:2024-01-29 21:08:45 标签:pandas 条件 替换