Python:在多列中查找字符串并在新列中返回它

2024-05-04 21:55:09 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一个多栏的excel数据,我需要定义特定的单词并在新栏中返回它 该表如下所示:

ID   col0  col1  col2  col3  col4  col5
1    jack  a/h   t/m   w/n   y/h    56
2    sam   z/n   b/w   null  null   93
3    john  b/i   y/d   p/d   null   33

我想在col1、col2、col3和col4列中查找“b”,并创建一个名为“b”的新列,其中返回单元格值be的值

结果是这样的

ID   col0  col1  col2  col3  col4  col5  b
1    jack  a/h   t/m   w/n   y/h    56   -
2    sam   z/n   b/w   null  null   93   b/w
3    john  b/i   y/d   p/d   null   33   b/i

我需要一个有效的方法我试着用在这样的地方

df1 = df[['col1', 'col2', 'col3', 'col4']]

df1['b']==[x for x in df1.values[0] if any(b for b in lst if b in str(x))]

我从这个答案中得到这个https://stackoverflow.com/a/50250103/3105140

但它对我不起作用,因为我有空值和条件不起作用的行


Tags: inidforifsamjohnnullcol2
3条回答

下面是一种将^{}^{}^{}一起使用的方法:

cols = ['col1', 'col2', 'col3', 'col4']
df['b'] = (df[cols].where(df[cols].stack().str.contains('b')
         .unstack(fill_value=False)).ffill(1).iloc[:,-1])

print(df)

   ID  col0 col1 col2 col3 col4  col5    b
0   1  jack  a/h  t/m  w/n  y/h    56  NaN
1   2   sam  z/n  b/w  NaN  NaN    93  b/w
2   3  john  b/i  y/d  p/d  NaN    33  b/i

我将^{}^{}一起使用:

cols = ['col1', 'col2', 'col3', 'col4']
df['b']=(df[cols].stack()
                 .loc[lambda x: x.str.contains('b')]
                 .reset_index(level=1,drop=1)
                #.fillna('-') #for the expected output
        )

输出

   ID  col0 col1 col2 col3 col4  col5    b
0   1  jack  a/h  t/m  w/n  y/h    56  NaN
1   2   sam  z/n  b/w  NaN  NaN    93  b/w
2   3  john  b/i  y/d  p/d  NaN    33  b/i

为了避免选择列,我使用了melt

M = (df.copy()
     .melt(id_vars='ID')
     .loc[lambda x:x['value'].astype('str').str.contains('b')]
     .drop('variable',axis=1))

pd.merge(df,M,how='left',on='ID').rename({'value':'b'},axis=1)

    D   col0    col1    col2    col3    col4    col5     b
0   1   jack    a/h     t/m     w/n     y/h      56     NaN
1   2   sam     z/n     b/w     NaN     NaN      93     b/w
2   3   john    b/i     y/d     p/d     NaN      33     b/i

相关问题 更多 >