Pandas 有条件地为包含列表的条目创建系列/数据框列

时间:2021-05-20 14:52:26

标签: pandas numpy

我从这篇文章开始: Pandas conditional creation of a series/dataframe column

在我的特定情况下,我的数据如下所示:

    Type       Set
1    A        [1,2,3]
2    B        [1,2,3]         
3    B        [3,2,1]
4    C        [2,4,1]

我使用 np.where 借用了这个想法,所以如果我需要根据每个条目中列表中的最后一个元素创建一个新的 col,我写道:

df['color'] = np.where(df['Set'].str(-1)==3, 'green', 'red'),这会产生:

  Set Type  color
0   Z [1,2,3]  green
1   Z [1,2,3]  green
2   X [3,2,1]    red
3   Y [2,4,1]    red

现在我希望更灵活,想说,如果列表中显示3个,我将分配color=green。我尝试使用 in 或 isin(),它们不适用于 np.where。希望了解我上面有哪些类似格式的其他选项。 (如果可能,不要使用 for 循环)。

The desired output:
      Set Type  color
    0   Z [1,2,3]  green
    1   Z [1,2,3]  green
    2   X [3,2,1]  green
    3   Y [2,4,1]    red

2 个答案:

答案 0 :(得分:4)

试试 explode

df['new']= np.where(df.Set.explode().eq(3).any(level=0),'green','red')
df
Out[131]: 
        Type    new
0  [1, 2, 3]  green
1  [1, 2, 3]  green
2  [3, 2, 1]  green
3  [2, 4, 1]    red

答案 1 :(得分:2)

您也可以转换为字符串并使用 str.contains:

find=3
df['color'] = np.where(df["Set"].astype(str).str.contains(str(find)),'green','red')

或者使用条件所在的数据框

pd.DataFrame(df["Set"].to_list(),index=df.index).eq(3).any(1)

print(df)

  Type        Set  color
1    A  [1, 2, 3]  green
2    B  [1, 2, 3]  green
3    B  [3, 2, 1]  green
4    C  [2, 4, 1]    red
相关问题