gpt4 book ai didi

python - 使用 pandas 组合组

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:53 24 4
gpt4 key购买 nike

想象一个pandas数据框由

df = pd.DataFrame({
'id': range(1, 10),
'mfr': ('a', 'b', 'a', 'c', 'd', 'e', 'd', 'd', 'f'),
'vmn': ('A', 'A', 'B', 'C', 'D', 'E', 'F', 'F', 'D')
})

给出下表

   id mfr vmn
0 1 a A
1 2 b A
2 3 a B
3 4 c C
4 5 d D
5 6 e E
6 7 d F
7 8 d F
8 9 f D

我希望通过按 mfr 和/或 vmn 分组来确定哪些 id 属于彼此。我可以通过使用其中一个轻松地分配组 ID

df['groupby_mfr'] = df.groupby('mfr').grouper.group_info[0]
df['groupby_vmn'] = df.groupby('vmn').grouper.group_info[0]

给出以下内容

   id mfr vmn  groupby_mfr  groupby_vmn
0 1 a A 0 0
1 2 b A 1 0
2 3 a B 0 1
3 4 c C 2 2
4 5 d D 3 3
5 6 e E 4 4
6 7 d F 3 5
7 8 d F 3 5
8 9 f D 5 3

现在我想将它组合到一个新的组 ID 中,这样生成的数据框就变成了这样

   id mfr vmn  groupby_mfr  groupby_vmn  combined_group
0 1 a A 0 0 0
1 2 b A 1 0 0
2 3 a B 0 1 0
3 4 c C 2 2 1
4 5 d D 3 3 2
5 6 e E 4 4 3
6 7 d F 3 5 2
7 8 d F 3 5 2
8 9 f D 5 3 2

前两行相同,因为 vmn 相等。第三个也是同一组,因为第 3 行和第 1 行对于 vmn 是相同的。等等……

另请注意,这将在具有许多行的多列上运行,因此性能也非常受欢迎。

最佳答案

正如原帖评论中所建议的,可以使用 networkx 来解决。 .

import networkx as nx
import pandas as pd

df = pd.DataFrame({
'id': range(1, 10),
'mfr': ('a', 'b', 'a', 'c', 'd', 'e', 'd', 'd', 'f'),
'vmn': ('A', 'A', 'B', 'C', 'D', 'E', 'F', 'F', 'D')
})

G = nx.from_pandas_edgelist(df, 'mfr', 'vmn')
Gcc = nx.connected_components(G)

connected_map = dict()
for g, ids in enumerate(Gcc):
for id in ids:
connected_map[id] = g

df['combined_group'] = df['mfr'].map(connected_map)

产生

   id mfr vmn  combined_group
0 1 a A 0
1 2 b A 0
2 3 a B 0
3 4 c C 1
4 5 d D 2
5 6 e E 3
6 7 d F 2
7 8 d F 2
8 9 f D 2

关于python - 使用 pandas 组合组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com