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

t40tm48m  于 2023-02-28  发布在  其他
关注(0)|答案(2)|浏览(126)

我有以下信息。
假设我有以下列表。

my_list = [2,3,4,5]

我的 Dataframe 如下:
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将相应行中的值更改为Hot,除非保持值列中的值不变。
我想看看下面这样的东西。

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

我只是在寻找一个简单的脚本,可以迭代和签入每一行,并改变在另一列的值对应的行。
有人能帮忙吗?

o8x7eapl

o8x7eapl1#

首先使用explode Col1检查值是否在my_list中,然后使用groupby + any获取一系列布尔值(如果列表中至少有一项,则为True)。
如果满足以下两个条件,则使用此值和Score上的条件mask“Hot”值:

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
wkftcu5l

wkftcu5l2#

下面是使用map()where()的方法:

s1 = df['col1'].map(lambda x: any([i in my_list for i in x]))
s2 = df['Score'].gt(0)
df.assign(Value = df['Value'].mask((s1 & s2),'Hot'))

np.where(df['col1'].explode().isin(my_list).groupby(level=0).any() & df['Score'].gt(0),'Hot',df['Value'])

旧答案:

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

相关问题