熊猫“滚动” groupby

时间:2020-10-20 07:02:17

标签: python pandas

假设这是我的df:

    group     connected_to
0     1              1
1     2              0
2     2              1
3     2              2
4     3              5
5     4              4
6     3              7 
7     5              5

我想得到的是minimal group per connected rows

因此第0行连接到1,因此它们在同一组中。第2行也连接到1-因此它加入了组。第3行连接到加入该组的第2行,因此它也加入该组等。 第4行未连接到第一组中的任何行,因此它是新组。输出应如下所示:

    group     connected_to   minimal_group
0     1              1            1
1     2              0            1
2     2              1            1
3     2              2            1
4     3              5            3
5     4              4            3
6     3              7            3 
7     5              5            3

我在for内使用while实现了它-确实很丑陋。 在熊猫上有没有更优雅的方法?

1 个答案:

答案 0 :(得分:2)

使用:

import networkx as nx

#convert index to column index
df1 = df.reset_index()

# Create the graph from the dataframe
g = nx.Graph()
g = nx.from_pandas_edgelist(df1,'index','connected_to')

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] = cid

mapping index column by connected groups and get minimal group to new column
df['minimal_group'] = df1.groupby(df1['index'].map(node2id))['group'].transform('min')
print (df)
   group  connected_to  minimal_group
0      1             1              1
1      2             0              1
2      2             1              1
3      2             2              1
4      3             5              3
5      4             4              3
6      3             7              3
7      5             5              3