检查列中是不是存在值并根据不同条件在另一个 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 条件?