熊猫-合并行并使用'get_dummies'添加列

Ely*_*ire 3 python dataframe pandas

使用以下数据框:

import pandas as pd
df=pd.DataFrame(data=[[1,5179530,'rs10799170',8.1548,'E001'], [1,5179530,'rs10799170',8.1548,'E002'], [1,5179530,'rs10799170',8.1548,'E003'], [1,455521,'rs235884',2.584,'E003'], [1,455521,'rs235884',2.584,'E007']], col    umns=['CHR','BP','SNP','CM','ANNOT'])

   CHR       BP         SNP      CM ANNOT
0    1  5179530  rs10799170  8.1548  E001
1    1  5179530  rs10799170  8.1548  E002
2    1  5179530  rs10799170  8.1548  E003
3    1   455521    rs235884  2.5840  E003
4    1   455521    rs235884  2.5840  E007
Run Code Online (Sandbox Code Playgroud)

我想获得

   CHR       BP         SNP      CM  E001  E002  E003  E007
0    1  5179530  rs10799170  8.1548     1     1     1     0  
1    1   455521    rs235884  2.5840     0     0     1     1
Run Code Online (Sandbox Code Playgroud)

我想groupby()get_dummies()分别

df.groupby(['CHR','BP','SNP','CM']).sum()

    CHR BP      SNP        CM         ANNOT           
1   455521  rs235884   2.5840      E003E007
    5179530 rs10799170 8.1548  E001E002E003

pd.get_dummies(df['ANNOT'])

    E001  E002  E003  E007
0     1     0     0     0
1     0     1     0     0
2     0     0     1     0
3     0     0     1     0
4     0     0     0     1
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何将两者结合起来,或者是否还有其他方法。

bun*_*nji 7

正如@Dadep在其评论中指出的那样,这可以通过数据透视表来实现。如果您想坚持自己的get_dummies+ groupby技术,尽管可以执行以下操作:

pd.concat([df, pd.get_dummies(df.ANNOT)], 1).groupby(['CHR','BP','SNP','CM']).sum().reset_index()
Run Code Online (Sandbox Code Playgroud)

这首先将数据帧和get_dummies调用的输出连接起来,然后根据相关列将结果分组,将这些列之和归入这些组,然后重置索引,因此您不必处理多索引数据框。结果看起来像:

   CHR       BP         SNP      CM  E001  E002  E003  E007
0    1   455521    rs235884  2.5840     0     0     1     1
1    1  5179530  rs10799170  8.1548     1     1     1     0
Run Code Online (Sandbox Code Playgroud)


Roe*_*ant 5

你非常接近!只需结合这两种技术:

dummies = pd.get_dummies(df['ANNOT'])
combine = pd.concat([df, dummies], axis=1)
out = combine.groupby(['BP','CHR','SNP','CM']).sum().reset_index()
Run Code Online (Sandbox Code Playgroud)

或者根据您的应用程序,你可能需要使用.max替代sum。请注意,我更改了 groupby 中的顺序以防止出现一个 CHR 组。只需按照您想要的顺序获取结果:

out = out[['CHR', 'BP', 'SNP', 'CM'] + list(dummies)]
Run Code Online (Sandbox Code Playgroud)