簡體   English   中英

Pandas - 合並行並使用'get_dummies'添加列

[英]Pandas - Merge rows and add columns with 'get_dummies'

使用以下數據幀:

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

我想獲得

   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

我分別嘗試了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

但我不知道如何將兩者結合起來或者如果有另一種方式。

正如@Dadep在評論中指出的那樣,這可以通過數據透視表來實現。 如果你想堅持你的get_dummies + groupby技術,你可以做以下事情:

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

這首先連接數據幀和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

你很親密! 只需結合兩種技術:

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

或者根據您的應用程序,您可能希望使用.max而不是sum 請注意,我更改了groupby中的順序以阻止一個CHR組。 只需按照您想要的順序獲得結果:

out = out[['CHR', 'BP', 'SNP', 'CM'] + list(dummies)]

這是一種方法,使用groupbyapply

In [66]: (df.groupby(['CHR', 'BP', 'SNP', 'CM'])
            .apply(lambda x: {y:1 for y in x['ANNOT']})
            .apply(pd.Series)
            .fillna(0)
            .reset_index())
Out[66]:
   CHR       BP         SNP      CM  E001  E002  E003  E007
0    1   455521    rs235884  2.5840   0.0   0.0   1.0   1.0
1    1  5179530  rs10799170  8.1548   1.0   1.0   1.0   0.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM