Python Pandas 如果同一行中的其他列与特定字符串匹配,则创建新列

Python Pandas create new column if other columns in the same row match certain string

我正在研究 Python Pandas。数据框就像:

Group Group1 Group2 Group3
11abc q q q
q q q q
q 22abc q q

我想创建一个额外的专栏。如果在同一行中,有一个项目匹配子字符串“abc”,则准确的值将被复制到新列。

预期结果:

|Group |  Group1 |  Group2 |  Group3 | NewColumn |
|------|---------|---------|---------|-----------|
|11abc |    q    |    q    |    q    | 11abc     |
|q     |    q    |    q    |    q    | (no value)|
|q     |  22abc  |    q    |    q    | 22abc     |

我在谷歌上搜索了一会儿,发现我可以使用 pd.series.str.contains('abc') 来 return TRUE。然后我计划循环浏览这些列。首先,我首先尝试了一个专栏:

IF df_target[df_target['Group'].str.contains('abc')]:
    df_target['NewColumn'] = df_target['Group']

但是,我遇到错误“Cannot mask with non-boolean array containing NA / NaN values”。我倒退了一步,我不确定我的方向是否正确。我想与社区核实在 Pandas?

中执行此类数据转换任务的合适方法是什么

非常感谢..

如果可能的多重匹配,您可以通过 ,:

连接过滤行
df['NewColumn'] = df.apply(lambda x: ', '.join(x[x.str.contains('abc')]), axis=1)
print (df)
   Group Group1 Group2 Group3 NewColumn
0  11abc      q      q      q     11abc
1      q      q      q      q          
2      q  22abc      q      q     22abc

IIUC,堆叠并进行比赛:

s = df.stack()
out = df.join(s[s.str.contains('abc')]
               .groupby(level=0).agg(','.join)
               .rename('NewColumn'))

输出:

   Group Group1 Group2 Group3 NewColumn
0  11abc      q      q      q     11abc
1      q      q      q      q       NaN
2      q  22abc      q      q     22abc

非常感谢 mozway 和 jezael。我尝试了两种方法,它们都有效。

小提示,我在str.contains('abc',na=False)里面也加入了一个参数,因为我在实际数据中有na