【问题标题】:Python: find string in multiple columns and return it in new columnPython:在多列中查找字符串并在新列中返回
【发布时间】:2020-05-09 18:59:26
【问题描述】:

您好,我有一个包含多列的 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”的新列,其中返回单元格值的值

结果应该是这样的

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得到这个

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

【问题讨论】:

    标签: python excel string pandas if-statement


    【解决方案1】:

    这是一种使用stackstr.containsdf.where 的方法:

    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
    

    【讨论】:

    • @Sarah 很高兴它有帮助。 :)
    【解决方案2】:

    我会将DataFrame.stackcallable 一起使用:

    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
    

    【讨论】:

      【解决方案3】:

      为了避免选择列,我使用了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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 2014-03-17
        • 2020-01-04
        相关资源
        最近更新 更多