【问题标题】:replace celle within a dataframe according to matching element in another df in pandas根据熊猫中另一个df中的匹配元素替换数据框中的celle
【发布时间】:2022-01-24 07:16:16
【问题描述】:

我有两个数据框,例如

Tab1:

ORFs_values      Groups       SP1  SP2   SP3
SP_ORF1          Group1       1    1     0
SP_ORF1          Group2       0    0     0
SP_ORF1          Group3       0    1     0
SP_ORF1          Group4       1    1     1
SP_ORF1          Group5       1    1     1

还有一个:

Tab2

Groups         SP_names   SP_names2
Group1         SP1        SP1_A
Group1         SP2        SP2_A
Group3         SP2        SP2_BL
Group4         SP1        SP1_BI
Group4         SP2        SP2_OP
Group4         SP3        SP3_I
Group5         SP3        SP3_0 
Group5         SP3        SP3_P
Group5         SP3        SP3_K 

我想将 Tab1 中的所有单元格替换为 1,并为每个匹配的 GroupsSP_names 替换为对应的 SP_names2

例如,在Tab1的第一行,Group1SP1SP_names2值为SP1_A,所以我将1替换为SP1_A等等。 ..

Group5 示例中存在重复时,我需要添加所有重复的SP_names2,并用管道分隔?

然后我应该得到以下输出:

New_tab1:

ORFs_values      Groups       SP1      SP2       SP3
SP_ORF1          Group1       SP1_A    SP2_A     0
SP_ORF1          Group2       0         0        0
SP_ORF1          Group3       0         SP2_BL   0
SP_ORF1          Group4       SP1_BI    SP2_OP   SP3_I
SP_ORF1          Group5       0         0        SP3_0|SP3_P|SP3_K 

到目前为止,我得到了这个尝试:

df = df.set_index('Groups')
(df.mask(df.eq(1),
         df2.set_index(['Groups','SP_names'])['SP_names2'].unstack())
 .reset_index())

但它并没有考虑到由管道分隔的多个SP_names2元素...

如果有帮助,这里有两个 dict 格式的 df:

Tab1

{'ORFs_values': {0: 'SP_ORF1', 1: 'SP_ORF1', 2: 'SP_ORF1', 3: 'SP_ORF1'}, 'Groups': {0: 'Group1', 1: 'Group2', 2: 'Group3', 3: 'Group4'}, 'SP1': {0: 1, 1: 0, 2: 0, 3: 1}, 'SP2': {0: 1, 1: 0, 2: 1, 3: 1}, 'SP3': {0: 0, 1: 0, 2: 0, 3: 1}}

Tab2

{'Groups': {0: 'Group1', 1: 'Group1', 2: 'Group3', 3: 'Group4', 4: 'Group4', 5: 'Group4', 6: 'Group5', 7: 'Group5', 8: 'Group5'}, 'SP_names': {0: 'SP1', 1: 'SP2', 2: 'SP2', 3: 'SP1', 4: 'SP2', 5: 'SP3', 6: 'SP3', 7: 'SP3', 8: 'SP3'}, 'SP_names2': {0: 'SP1_A', 1: 'SP2_A', 2: 'SP2_BL', 3: 'SP1_BI', 4: 'SP2_OP', 5: 'SP3_I', 6: 'SP3_0 ', 7: 'SP3_P', 8: 'SP3_K '}}

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    DataFrame.pivot_table与聚合函数join一起使用:

    df2['SP_names2'] = df2['SP_names2'].str.strip()
    df2 = df2.pivot_table(index='Groups', 
                          columns='SP_names', 
                          values='SP_names2', 
                          aggfunc='|'.join, 
                          fill_value=0)
    print (df2)
    SP_names     SP1     SP2                SP3
    Groups                                     
    Group1     SP1_A   SP2_A                  0
    Group3         0  SP2_BL                  0
    Group4    SP1_BI  SP2_OP              SP3_I
    Group5         0       0  SP3_0|SP3_P|SP3_K
    

    如果非缺失值与df1 中的1 相同,则可以使用DataFrame.join

    df = df1[['ORFs_values','Groups']].join(df2, on='Groups').fillna(0)
    print (df)
      ORFs_values  Groups     SP1     SP2    SP3
    0     SP_ORF1  Group1   SP1_A   SP2_A      0
    1     SP_ORF1  Group2       0       0      0
    2     SP_ORF1  Group3       0  SP2_BL      0
    3     SP_ORF1  Group4  SP1_BI  SP2_OP  SP3_I
    

    如果需要将1 替换为df2

    df = df.set_index('Groups')
    df = df.mask(df.eq(1), df2).reset_index().reindex(df1.columns, axis=1)
    print (df)
      ORFs_values  Groups     SP1     SP2    SP3
    0     SP_ORF1  Group1   SP1_A   SP2_A      0
    1     SP_ORF1  Group2       0       0      0
    2     SP_ORF1  Group3       0  SP2_BL      0
    3     SP_ORF1  Group4  SP1_BI  SP2_OP  SP3_I
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-23
      • 2020-07-31
      • 2019-01-20
      • 2018-10-23
      • 2019-06-30
      • 2023-04-03
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多