我有一个三栏的熊猫数据框,Protein_A,Protein_B,交互。
see it here
我想通过将Protein_A和Protein_B分组来查找所有交互作为值计数。此外,将Protein_A和Protein_B分组时,顺序并不重要。
Protein_A Interaction Protein_B
0 A1BG ER A2M
1 A1BG MI ABCC6
2 ABCC6 AS A1BG
3 A1BG MI ADAM10
4 A1BG MI ADAM17
结果将如下所示:
{AB1G, A2M} -> ER
{AB1G, ABCC6} -> MI, AS
{A1BG, ADAM10} -> MI
{A1BG, ADAM17} -> MI
最佳答案
我同意您要对行进行分组,但是预期结果表明
而不是每个组的价值计数,您实际上想要一个列表
交互代码。
要创建这样的列表(针对每个组),请执行以下操作:
从定义一个函数开始,该函数计算分组键
-蛋白质代码(A和B)的排序列表,转换为字符串:
def protSorted(key):
row = df.loc[key]
return ', '.join(sorted([row.Protein_A, row.Protein_B]))
然后通过此功能将源DataFrame分组,进行交互
每个组中的列,并创建一个交互代码列表:
df.groupby(protSorted).Interaction.apply(list)
对于您的样本数据,结果是如下所示的系列:
A1BG, A2M [ER]
A1BG, ABCC6 [MI, AS]
A1BG, ADAM10 [MI]
A1BG, ADAM17 [MI]
Name: Interaction, dtype: object
或者,如果您要为每个组使用一个字符串(不包含方括号),
改为运行:
df.groupby(protSorted).Interaction.apply(', '.join)
这次的结果是:
A1BG, A2M ER
A1BG, ABCC6 MI, AS
A1BG, ADAM10 MI
A1BG, ADAM17 MI
Name: Interaction, dtype: object