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_ucattusS-\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
col2
str.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