看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求根据分组后组内的指定列值,按逻辑指定一个列值,来形成一个新的列。我们来看看如何利用 pandas 和 NumPy 来便捷完成这样的需求。
两个原始数据如下:
import pandas as pd
import io
data = '''
Container Event
A Clean
B Dry
A Clean
A Dry
B Clean
C Clean
C Clean
C Clean
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
增加一个名为“Temperature”的新列,当 Container 第一次出现Event为“Clean”时,它的值为4,而所有后续的“Clean“事件的值为3。Dry时的值总是1。
效果如:
'''
Container Event Temperature
A Clean 4
B Dry 1
A Clean 3
A Dry 1
B Clean 4
C Clean 4
C Clean 3
C Clean 3
'''
我们主要利用 NumPy 的 np.select 函数来完成这个需求,通过不同的条件,指定不同的值,完成类似了 if-elif-else 这样的逻辑。
代码如下:
import numpy as np
cond1 = ~df.duplicated()
cond2 = df['Event'].eq('Clean')
cond3 = df['Event'].eq('Dry')
df['Temperature'] = np.select([cond1 & cond2, cond2, cond3], [4, 3, 1])
df
'''
Container Event Temperature
A Clean 4
B Dry 1
A Clean 3
A Dry 1
B Clean 4
C Clean 4
C Clean 3
C Clean 3
'''
这段代码的主要目的是根据一系列条件来计算并设置一个名为 'Temperature' 的新列,该列的值基于不同的条件而变化。
让我们逐步解释代码的含义:
cond1 = ~df.duplicated()
: 这行代码创建了一个名为 cond1 的布尔条件,它检查 DataFrame df 中的每一行,如果该行不是之前出现过的行(即不是重复行),则条件为 True。这通常用于确定 DataFrame 中的唯一行。
cond2 = df['Event'].eq('Clean')
: 这行代码创建了一个名为 cond2 的布尔条件,它检查 DataFrame df 中的 'Event' 列,如果 'Event' 列中的值等于 'Clean',则条件为 True。这是用于筛选出 'Event' 列中值为 'Clean' 的行。
cond3 = df['Event'].eq('Dry')
: 这行代码创建了一个名为 cond3 的布尔条件,它类似于 cond2,但用于筛选出 'Event' 列中值为 'Dry' 的行。
df['Temperature'] = np.select([cond1 & cond2, cond2, cond3], [4, 3, 1])
: 这是关键的一行代码。它使用了 np.select 函数,根据条件列表 [cond1 & cond2, cond2, cond3]`` 来选择对应的值列表
[4, 3, 1]`,并将结果存储在 DataFrame df 的新列 'Temperature' 中。
综上所述,这段代码的目的是根据不同的条件在 DataFrame 中的 'Temperature' 列中设置不同的值,这些条件包括行是否为重复行,以及 'Event' 列中的值是 'Clean' 还是 'Dry'。
也可以不用加条件三,直接用 default 指定也可以完成需求:
import numpy as np
cond1 = ~df.duplicated()
cond2 = df['Event'].eq('Clean')
df['Temperature'] = np.select([cond1 & cond2, cond2], [4, 3], default=1)
这样就完成了需求。
(完)
更新时间:2024-08-18 16:17:37 标签:pandas python 列值