[英]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)]
這是一種方法,使用groupby
和apply
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.