Pandas创建多个聚合

时间:2016-05-11 22:33:22

标签: python pandas

试着看看这与熊猫有多么难或多么容易。

让我们说一个人有两列数据,如:

Cat1  Cat2
A        1
A        2
A        3
B        1
B        2
C        1
C        2
C        3
D        4

如您所见AC有三个共同元素1, 2, 3B只有两个元素1和2. D只有一个元素:4。

如何以编程方式获得相同的结果。这个想法是让每个小组以某种方式返回。因此,[A, C][1, 2, 3][B][1, 2]以及[D] [4]

我知道可以写一个程序来做这个,所以我想弄清楚Pandas上是否有东西可以做到,而不必从头开始构建东西。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用groupby两次来实现此目的。

df = df.groupby('Cat1')['Cat2'].apply(lambda x: tuple(set(x))).reset_index()
df = df.groupby('Cat2')['Cat1'].apply(lambda x: tuple(set(x))).reset_index()

我正在使用tuple,因为pandas需要使用元素才能进行groupby。上面的代码不区分(1, 2, 3)(1, 1, 2, 3)。如果您想进行此区分,请将set替换为sorted

结果输出:

        Cat2    Cat1
0     (1, 2)    (B,)
1  (1, 2, 3)  (A, C)
2       (4,)    (D,)

答案 1 :(得分:0)

你也可以:

df = df.set_index('Cat1', append=True).unstack().loc[:, 'Cat2']
df = pd.Series({col: tuple(values.dropna()) for col, values in df.items()})
df = df.groupby(df.values).apply(lambda x: list(x.index))

获取

                   Cat1
(1.0, 2.0)          [B]
(1.0, 2.0, 3.0)  [A, C]
(4.0,)              [D]