我有兩個資料框,例如
表 1:
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
另一個:
選項卡2
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
我想用 1替換Tab1 中的所有單元格,并用它們對應SP_names2的每個匹配Groups和替換SP_names。
例如,第一行中TAB1中,SP_names2對價值SP1的Group1是SP1_A,讓我通過更換1次SP1_A等等...
當Group5示例中存在重復項時,我需要添加SP_names2由管道分隔的所有重復項嗎?
然后我應該得到以下輸出:
新標簽1:
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由管道分隔的多個元素......
如果有幫助,這里有兩個 df 格式的 df:
選項卡1
{'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}}
選項卡2
{'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 '}}
uj5u.com熱心網友回復:
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
如果非缺失值與1in相同,df1則可以使用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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420504.html
標籤:
上一篇:IndexError:串列索引超出范圍,python3
下一篇:難以從網頁中抓取表格
