使用熊猫,如何按两列查找值计数

时间:2019-08-03 17:38:38

标签: python pandas pandas-groupby

我有一个熊猫数据框,其中有三列,Protein_A,Protein_B和Interaction。 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 

1 个答案:

答案 0 :(得分:1)

我同意您要对行进行分组,但预期结果表明 您实际上不需要每个组的列表,而不是每个组的价值计数 交互代码。

要为每个组创建这样的列表,请按以下步骤操作:

从定义一个函数开始,该函数将计算分组密钥 -蛋白质代码(A和B)的排序列表,转换为字符串:

def protSorted(key):
    row = df.loc[key]
    return ', '.join(sorted([row.Protein_A, row.Protein_B]))

然后通过此功能将源DataFrame分组,进行 Interaction 每个组中的列,并创建一个交互代码列表:

df.groupby(protSorted).Interaction.apply(list)

对于您的示例数据,结果为 Series ,如下所示:

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