检查列中是不是存在值并根据不同条件在另一个 Pandas 中更改:Pandas

Posted

技术标签:

【中文标题】检查列中是不是存在值并根据不同条件在另一个 Pandas 中更改:Pandas【英文标题】:Check if a value exist in a column and change in another Pandas based on different conditions: Pandas检查列中是否存在值并根据不同条件在另一个 Pandas 中更改:Pandas 【发布时间】:2022-01-24 00:13:40 【问题描述】:

我有以下信息。

假设我有以下列表。

my_list = [2,3,4,5]

我的数据框如下:

df

Col1      Score  Value
[1,3,6]    0      Hot
[7]        10     Mild
[10,11,2]  50     Cool
[5,9]      0      Cool
[2,5,6]    100    Mild

我想检查列表 my_list 中的一个值是否存在于列 Col1 中。如果存在,则通过检查是否Score > 0将对应行的Value列中的值更改为Hot,除非保持Value列中的值不变。

我希望看到类似下面的内容。

Col1      Score  Value
[1,3,6]    0      Hot
[7]        10     Mild
[10,11,2]  50     Hot
[5,9]      0      Cool
[2,5,6]    100    Hot

我只是在寻找一个简单的脚本,它可以迭代并检查每一行,并在对应行的另一列中更改一个值。

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

首先explode Col1 检查值是否在 my_list 中,然后groupby+any 获得一系列布尔值(如果列表中至少有一个项目则为真)。

如果满足这两个条件,则使用这个和一个条件来得分mask 带有“热”的值:

match = df['Col1'].explode().isin(my_list).groupby(level=0).any()
df['Value'] = df['Value'].mask(match & df['Score'].gt(0), 'Hot')

输出:

          Col1  Score Value
0    [1, 3, 6]      0   Hot
1          [7]     10  Mild
2  [10, 11, 2]     50   Hot
3       [5, 9]      0  Cool
4    [2, 5, 6]    100   Hot

【讨论】:

【参考方案2】:

这是一种使用map()where()的方法:

s1 = df['col1'].map(lambda x: any([i in my_list for i in x]))
s2 = df['Score'].eq(0)
df.assign(Value = df['Value'].where((s1 | s2),df['Value']))

输出:

           col1  Score Value
0     [1, 3, 6]      0   Hot
1           [7]     10  Mild
2  [10, 11, 12]     50   Hot
3        [5, 9]      0  Cool
4     [2, 5, 6]    100   Hot

【讨论】:

以上是关于检查列中是不是存在值并根据不同条件在另一个 Pandas 中更改:Pandas的主要内容,如果未能解决你的问题,请参考以下文章

excel中如何检查一列中的内容是不是包含在另一个文档的一列中。

如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?

使用不同的表触发检查条件,然后根据结果更改插入行的值

Excel技巧:判断某一列中的数据是不是在另一列中

excel中判断一个表中的某一列的数据在另一个表中的某一列中是不是存在

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入