【问题标题】:Pandas group different rows with same values in different columnsPandas 在不同的列中对具有相同值的不同行进行分组
【发布时间】:2021-04-20 00:16:34
【问题描述】:

我有一个数据框,它的不同部分具有相同的值,它们可以位于不同的行和不同的列中。例如,它在 2 个不同的列中有相同的电子邮件,我想用这封电子邮件获取 2 个不同行的 id。

test1 = pd.DataFrame([{'id': 'iii1', 'phone': 'aaa1', 'email': 'qqq1', 'phone2': 'bbb1', 'email2': 'sss1'},
                     {'id': 'iii2', 'phone': 'aaa2', 'email': 'qqq2', 'phone2': 'aaa1', 'email2': 'sss2'},
                     {'id': 'iii3', 'phone': 'aaa3', 'email': 'qqq3', 'phone2': 'bbb3', 'email2': 'sss3'},
                     {'id': 'iii4', 'phone': 'aaa4', 'email': 'qqq4', 'phone2': 'bbb4', 'email2': 'qqq3'},
                     {'id': 'iii5', 'phone': 'aaa5', 'email': 'qqq5', 'phone2': 'bbb5', 'email2': 'sss5'},
                     {'id': 'iii6', 'phone': 'aaa6', 'email': 'qqq6', 'phone2': 'bbb6', 'email2': 'qqq1'}])

我尝试通过以下步骤实现:

  1. 熔化柱
test2 = pd.melt(
            test1, id_vars=['id'],
                                value_vars=['phone', 'email', 'phone2', 'email2']
        ).sort_values(by=['id'], ascending=False).reset_index(drop=True)
  1. 按融合值分组:
def testf(ser):
    uniqs = pd.unique(ser.values.ravel()).tolist()
    uniqs_len = len(uniqs)
    if uniqs_len > 1:
        return uniqs
    else:
        return 'only 1, doesnt interesting'

test3 = test2.groupby('value')['id'].apply(testf).reset_index()

所以最后经过这些步骤我得到了:

这几乎是我想要的,但预期的结果应该是
[iii1,iii2,iii6]; [iii3,iii4]
我认为其他方式可以合并,但我不知道如何实现。

【问题讨论】:

    标签: python pandas aggregate


    【解决方案1】:

    您的问题是网络问题。试试networkx

    import networkx as nx
    
    test2 = (test1.melt('id')
                  .loc[lambda x: x.duplicated('value',keep=False)]
            )
    
    # merge on `value` to connect the id's with same `value`
    G = nx.from_pandas_edgelist(test2.merge(test2, on=['value']),    
                                source='id_x', target='id_y')
    
    # output
    list(nx.connected_components(G))
    

    输出:

    [{'iii1', 'iii2', 'iii6'}, {'iii3', 'iii4'}]
    

    【讨论】:

    • 非常感谢,这简直太神奇了!我想过自己合并它,但它看起来更复杂。老实说,从未听说过networkx,很棒的功能。感谢您让我的代码更简洁 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2013-02-05
    • 1970-01-01
    • 2023-04-02
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多