【问题标题】:Pandas: How to create a group index iterativelyPandas:如何迭代地创建组索引
【发布时间】:2019-08-15 15:07:04
【问题描述】:

我有一个这种格式的数据框

| id | account | address |
|----|---------|---------|
| 1  | acc1    | add1    |
| 2  | acc1    | add2    |
| 3  | acc2    | add2    |
| 4  | acc3    | add3    |
| 5  | acc1    | add4    |
| 6  | acc4    | add5    |
| 7  | acc2    | add6    |
| 8  | acc5    | add7    |
| 9  | acc6    | add4    |
| 10 | acc7    | add8    |
| 11 | acc8    | add9    |
| 12 | acc2    | add10   |
| 13 | acc3    | add11   |
| 14 | acc9    | add12   |

现在,我想创建一个组索引,我想在其中查找帐户或地址已经是组的一部分的组。类似下面的东西

| id | account | address | group_index |
|----|---------|---------|-------------|
| 1  | acc1    | add1    | group1      |
| 2  | acc1    | add2    | group1      |
| 3  | acc2    | add2    | group1      |
| 4  | acc3    | add3    | group2      |
| 5  | acc1    | add4    | group1      |
| 6  | acc4    | add5    | group3      |
| 7  | acc2    | add6    | group1      |
| 8  | acc5    | add7    | group4      |
| 9  | acc6    | add4    | group1      |
| 10 | acc7    | add8    | group5      |
| 11 | acc8    | add9    | group6      |
| 12 | acc2    | add10   | group7      |
| 13 | acc3    | add11   | group2      |
| 14 | acc9    | add12   | group8      |

所以,首先我从 id(1) = (acc1, add1) 开始并分配一个组索引,例如 group1。 那么,id(2) 就是 (acc1, add2);因为 acc1 已经是 group1 的一部分,所以我也将这个 id(2) 分配给 group1。 那么,id(3) 就是 (acc2, add2);由于 add2 已经是 group1 的一部分(来自之前的分配),我也将 id(3) 分配给 group1

同样,我想创建组,如果帐户或地址已在组中,则帐户或地址出现的所有 id 都应属于同一组。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我相信你需要:

    import networkx as nx
    
    # Create the graph from the dataframe
    g = nx.Graph()
    g.add_edges_from(df[['account','address']].itertuples(index=False))
    
    connected_components = nx.connected_components(g)
    
    # Find the component id of the nodes
    node2id = {}
    for cid, component in enumerate(connected_components):
        for node in component:
            node2id[node] = 'group' + str(cid + 1)
    
    df['new'] = df['account'].map(node2id)
    print (df)
        id account address     new
    0    1    acc1    add1  group1
    1    2    acc1    add2  group1
    2    3    acc2    add2  group1
    3    4    acc3    add3  group2
    4    5    acc1    add4  group1
    5    6    acc4    add5  group3
    6    7    acc2    add6  group1
    7    8    acc5    add7  group4
    8    9    acc6    add4  group1
    9   10    acc7    add8  group5
    10  11    acc8    add9  group6
    11  12    acc2   add10  group1
    12  13    acc3   add11  group2
    13  14    acc9   add12  group7
    

    【讨论】:

    • 谢谢。想不到nx。只想创建索引和字典。
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 2020-08-11
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2015-02-14
    • 2019-07-28
    相关资源
    最近更新 更多