【问题标题】:Combined group by using pandas使用 pandas 的组合组
【发布时间】:2019-02-15 18:24:15
【问题描述】:

想象一个由

给出的pandasdata 帧
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 是相同的。等等……

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

【问题讨论】:

  • 不清楚combined_group是如何计算的,能否详细说明?
  • 似乎需要图表。我认为networkx在这里是必要的。
  • Groupby 可以带多个标签,我认为这是最好的方法(两个标签上的 groupby 然后使用 grouper 创建一个新列。
  • @RoyShahaf 那行不通。这将比我在这里要求的更独特的群体。
  • @mr.bjerre 您可以在此处查看如何查找组:stackoverflow.com/questions/45086731/… 然后您可以创建字典并将其中一个旧列转换为组列。但是,据我所知,它仅适用于两列:/

标签: python pandas pandas-groupby


【解决方案1】:

正如原始帖子中的 cmets 所建议的,可以使用 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

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 2019-02-16
    • 1970-01-01
    • 2019-04-19
    • 2014-09-10
    • 2019-08-26
    • 2018-02-14
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多