使用以下数据帧:
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
但我不知道如何将两者结合起来,或者是否有其他方法。
这里有一种方法,使用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
你很接近!只要将这两种技术结合起来:
dummies = pd.get_dummies(df['ANNOT'])
combine = pd.concat([df, dummies], axis=1)
out = combine.groupby(['BP','CHR','SNP','CM']).sum().reset_index()
或者根据您的应用程序,您可能希望使用. max
而不是和
。请注意,我更改了组中的顺序,以防止一个hr组。只需按您想要的顺序获取结果:
out = out[['CHR', 'BP', 'SNP', 'CM'] + list(dummies)]
正如@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
问题内容: 我有一个带有4列的(example-)数据框: 我现在想将B,C和D列合并/合并到新的E列,如本例所示: 我在这里发现了一个非常类似的问题,但这在A列的末尾添加了合并的列B,C和D: 感谢帮助。 问题答案: 选项1 使用和 选项2 使用分配和 选项3 最近,我喜欢第3个选项。 使用
问题内容: 可以说我有一个DataFrame如下: 我想创建一个新的DataFrame像这样: 可能的代码是什么? 问题答案: 1.使用Python 3.6+更新,使用带有列表理解功能的f字符串格式: 2.使用和: 3.如果您的列具有数字数据类型,请使用和: 输出:
问题内容: 我的MySQL表具有以下结构: 我想将以上三列合并为一列,如下所示: 我想将此“组合”列添加到表的末尾而不破坏原始的3个字段。 问题答案: 创建列: 更新当前值: 自动更新所有未来值:
问题内容: CREATE TABLE logistics ( id int primary key, campaign VARCHAR(255), event_type VARCHAR (255), date_offered VARCHAR (255), date_ordered DATE, date_delivered DATE, date_recorded DATE, date_complet
我想通过添加新列“count”来合并重复行 我想要的最终数据帧 行可以按任何顺序排列
问题内容: 假设我有两个这样的DataFrame: 我想合并它们,所以我尝试这样的事情: 我很开心 但是我正在尝试使用join方法,我被认为这是非常相似的。 我得到这个: 我想念什么? 问题答案: 我总是在索引上使用: 通过在以下各列上使用,可以具有相同的功能: