【问题标题】:Pandas dataframe conditional inner join with itselfPandas 数据框与自身有条件的内部连接
【发布时间】:2022-01-28 17:02:49
【问题描述】:

我正在寻找一种基于条件将数据框的列与其自身进行内部连接的方法。 我有一个由“组”和“个人”两列组成的大型数据框。现在我想创建第二个数据框,它为每个人元组都有一个条目,它一直在同一个组中。第一个数据框:

    Group | Person
    a1    | p1
    a1    | p2
    a1    | p3
    a1    | p4
    a2    | p1

输出:

    Person1 | Person2 | Weight
    p1      | p2      | 1
    p1      | p3      | 1
    p1      | p4      | 1
    p2      | p3      | 1
    p2      | p4      | 1
    p3      | p4      | 1

如果一组人属于多个组,则权重会增加。 到目前为止,我能够基于一个子数据框和两个 for 循环创建一个简单的实现。有没有更优雅,更重要的是,更快/内置的方式来做到这一点?

到目前为止我的实现:

    group = principals.iloc[i,0]

    sub = principals.loc[principals['Group'] == group]
    
    for j in range(len(sub)-1):
        for k in range (j+1,len(sub)):
            #check if tuple exists -> update or create new entry

我在想,是否有类似SQL内连接的功能,基于组相同的条件,然后以人对人的方式连接。在这种情况下,我可以处理双 p1|p1 条目...

在此先感谢

【问题讨论】:

    标签: python python-3.x pandas dataframe inner-join


    【解决方案1】:

    combinations 会给你你正在寻找的元组对。一旦你得到这些,你可以将元组组合分解成行。那么你的weight 是每对的组大小 - 在本例中为 1,因为它们都只存在于一个组中。

    import pandas as pd
    import numpy as np
    from itertools import combinations
    
    df = pd.DataFrame({'Group': ['a1', 'a1', 'a1', 'a1', 'a2'],
     'Person': ['p1', 'p2', 'p3', 'p4', 'p1']})
    
    df = (
        df.groupby('Group')['Person']
          .apply(lambda x: tuple(combinations(x,2)))
          .explode()
          .dropna()
          .reset_index()
    )
    
    df['Weight'] = df.groupby('Person').transform(np.size)
    df[['Person1','Person2']] = df['Person'].apply(pd.Series)
    
    df = df[['Person1','Person2','Weight']]
    
    print(df)
    

    输出

      Person1 Person2  Weight
    0      p1      p2       1
    1      p1      p3       1
    2      p1      p4       1
    3      p2      p3       1
    4      p2      p4       1
    5      p3      p4       1
    

    【讨论】:

    • 非常感谢。非常干净的解决方案,速度提高了大约 10 倍!
    • 我对您的解决方案还有另一个问题。在应用组合之前,如何对每个组中的人员进行排序?例如,顺序并不总是从最小的人到最大的人,而是随机的。在这种情况下,您的解决方案可以将 p1-p2 和 p2-p1 组合作为两个不同的组合。有没有办法先在组内排序?
    • 尝试先对数据框进行排序
    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2020-05-04
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多