[英]Merge columns values within the same dataframe in pandas
您好,我有一個 dataframe 如
>>> tab
COL1 COL2 COL3 COL4 COL5
0 G1 S_-__1Canis_lupus A B SEQ1
1 G1 S_+__2Elpah_bis C D SEQ4.1
2 G1 S_-__3Felis_cattus NaN NaN SEQA.B
3 G1 S_-__4Felis_cattus NaN NaN SEQA.B
4 G1 S-BICs_-__5Felis_cattus E F SEQA.A
5 G1 S_+__6Felis_cattus NaN NaN SEQA.A
6 G1 S_-__7Felis_cattus NaN NaN SEQA.A
7 G1 S-BICs_-__8Felis_cattus L P SEQA.B
8 G1 S_-__9Felis_cattus K L SEQA.A
9 G2 S_+__10Felis_cattus M N SEQA.A
10 G2 S_-__11Lupus_lupus NaN NaN SEQ3
這個想法是在每個COL1 groups
中關注包含模式的COL2
中的值: -BICs
然后用與包含-BICs
模式的相同COL5
值填充所有為NaN
的COL3
和COL4
值
例子:
在 line4 S-BICs_-__5Felis_cattus
有一個-BICs
模式,它的COL5
= SEQA.A
G1
內
S_-__3Felis_cattus和S_-__4Felis_cattus在COL3
和COL4
中具有NaN
值,並且具有相同的COL5
值。 然后我把S-BICs_-__5Felis_cattus
的COL3
和COL4
值:
>>> tab
COL1 COL2 COL3 COL4 COL5
0 G1 S_-__1Canis_lupus A B SEQ1
1 G1 S_+__2Elpah_bis C D SEQ4.1
2 G1 S_-__3Felis_cattus NaN NaN SEQA.B
3 G1 S_-__4Felis_cattus NaN NaN SEQA.B
4 G1 S-BICs_-__5Felis_cattus E F SEQA.A
5 G1 S_+__6Felis_cattus E F SEQA.A
6 G1 S_-__7Felis_cattus E F SEQA.A
7 G1 S-BICs_-__8Felis_cattus L P SEQA.B
8 G1 S_-__9Felis_cattus K L SEQA.A
9 G2 S_+__10Felis_cattus M N SEQA.A
10 G2 S_-__11Lupus_lupus NaN NaN SEQ3
與S-BICs_-__8Felis_cattus where NaN are transformed to
L and
P`
>>> tab
COL1 COL2 COL3 COL4 COL5
0 G1 S_-__1Canis_lupus A B SEQ1
1 G1 S_+__2Elpah_bis C D SEQ4.1
2 G1 S_-__3Felis_cattus L P SEQA.B
3 G1 S_-__4Felis_cattus L P SEQA.B
4 G1 S-BICs_-__5Felis_cattus E F SEQA.A
5 G1 S_+__6Felis_cattus E F SEQA.A
6 G1 S_-__7Felis_cattus E F SEQA.A
7 G1 S-BICs_-__8Felis_cattus L P SEQA.B
8 G1 S_-__9Felis_cattus K L SEQA.A
9 G2 S_+__10Felis_cattus M N SEQA.A
10 G2 S_-__11Lupus_lupus NaN NaN SEQ3
您可以where
col2 str.contains
模式的地方執行此操作,以用 nan 替換所有不包含模式的行。 然后通過 col1 和groupby.transform
進行 groupby.transform 並first
獲取(如果有的話,獲取非 nan 值)。 最后, fillna
原始數據,如:
tab[['COL3','COL4']] = (tab[['COL3','COL4']]
.fillna(tab[['COL3','COL4']]
.where(tab['COL2'].str.contains('-BICs'))
.groupby([tab['COL1'], tab['COL5']])
.transform('first'))
)
print (tab)
COL1 COL2 COL3 COL4 COL5
0 G1 S_-__1Canis_lupus A B SEQ1
1 G1 S_+__2Elpah_bis C D SEQ4.1
2 G1 S_-__3Felis_cattus L P SEQA.B
3 G1 S_-__4Felis_cattus L P SEQA.B
4 G1 S-BICs_-__5Felis_cattus E F SEQA.A
5 G1 S_+__6Felis_cattus E F SEQA.A
6 G1 S_-__7Felis_cattus E F SEQA.A
7 G1 S-BICs_-__8Felis_cattus L P SEQA.B
8 G1 S_-__9Felis_cattus K L SEQA.A
9 G2 S_+__10Felis_cattus M N SEQA.A
10 G2 S_-__11Lupus_lupus NaN NaN SEQ3
如果我理解正確,那么類似:
reference = tab.iloc[tab["COL2"].str.contains("-BICs"),:].rename(columns = {"COL2":"R_COL2","COL3":"R_COL3","COL4":"R_COL4"})
table = pd.merge(table,reference, how='left')
table.iat[table["COL3"].isnull(), 2] = table.iloc[table["COL3"].isnull(), 6]
table.iat[table["COL3"].isnull(), 3] = table.iloc[table["COL3"].isnull(), 7]
table = table[["COL1","COL2","COL3","COL4","COL5"]]
我沒有嘗試過,但我的想法是做類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.