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
我正在研究 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