Python 合并熊猫中相同数据帧内的列值
你好,我有一个数据帧,比如Python 合并熊猫中相同数据帧内的列值,python,pandas,dataframe,Python,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
>>> 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组中
关注COL2
中包含以下模式的值:-BICs
然后用与包含-BICs
模式相同的COL5
值填充所有COL3
和COL4
值
例如:
在第4行S-BICs-\u5felis\u cattus
有一个-BICs
模式,其COL5
=序列a
在G1内
S-\uu3felis_ucattus和S-\uu4felis_ucattus在COL3
和COL4
中具有NaN
值,并且具有相同的COL5
值。然后我把S-BICs-\u5felis\u cattus的COL3
和COL4
值
:
对于S-BICs-\uu8felis\u cattus也是如此,其中NaN被转换为L和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
如果我理解正确,那么像这样的事情呢:
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"]]
我没有试过,但我的想法是做类似的事情 您可以使用where
col2str.contains
pattern来使用nan来重新计算所有不包含模式的行。然后通过col1和col5,首先获取
(如果有的话,获取非nan值)。最后,填充原始数据,如:
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
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