有没有一种python方法来合并多个单元格与条件

时间:2020-07-16 06:28:53

标签: python pandas dataframe if-statement merge

我需要在多个单元格中搜索特定值,当找到该值时,应将其返回到新列中。

我在这里得到了答案; Python: find string in multiple columns and return it in new column但下面的这一行返回找到的第一个值

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

cols

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

我尝试了其他答案,它们都给了我错误ValueError: cannot reindex from a duplicate axis

任何人都知道如何在一个单元格中获得所有匹配的值。

数据集

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  b/n   93
3    john  b/i   y/d   b/d   null   33

我现在正在使用的代码:

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

这是我现在得到的输出

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  b/n   93   b/w
3    john  b/i   y/d   b/d   null   33   b/i

实际上我希望输出看起来像下面的数据框

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

2 个答案:

答案 0 :(得分:2)

使用DataFrame.filter过滤包含列col1-col4的数据框并使用DataFrame.stack,然后使用Series.str.contains过滤堆叠的数据框,最后在{{1}上使用Series.groupby }并使用level=0进行汇总:

join

结果:

s = df.filter(regex=r'col[1-4]').stack()
s = s[s.str.contains('b')].groupby(level=0).agg(' - '.join)
df['b'] = s

答案 1 :(得分:0)

这是使用melt的一种方法:

t = df.melt(id_vars="ID", value_vars = ["col0", "col1", "col2", "col3", "col4"], var_name=[]).dropna()

t = t[t.value.str.contains("b")].groupby("ID")["value"].apply(lambda x: " - ".join(x))

res = pd.concat([df, t], axis=1).rename(columns={"value":"b"})

输出为:

    ID  col0 col1 col2 col3 col4  col5          b
0  1.0  jack  a/h  t/m  w/n  y/h  56.0        NaN
1  2.0   sam  z/n  b/w  NaN  b/n  93.0        NaN
2  3.0  john  b/i  y/d  b/d  NaN  33.0  b/w - b/n
3  NaN   NaN  NaN  NaN  NaN  NaN   NaN  b/i - b/d