从Pandas group-by结果中计算唯一的组

时间:2014-03-10 21:17:28

标签: pandas

我想从Pandas group-by操作的结果中计算出唯一的组。例如,这是一个示例数据框。

In [98]: df = pd.DataFrame({'A': [1,2,3,1,2,3], 'B': [10,10,11,10,10,15]})                                                                        

In [99]: df.groupby('A').groups
Out[99]: {1: [0, 3], 2: [1, 4], 3: [2, 5]}

概念组是{1: [10, 10], 2: [10, 10], 3: [11, 15]},其中上面组中的索引位置被替换为B列中的值,但我遇到的第一个问题是如何转换这些位置(例如{{1} })来自[0, 3]列的值。

鉴于能够将组转换为BI列中的值组,可以手动计算唯一的组,但这里的第二个问题是Pandas是否有内置例程,我还没有看到。< / p>

使用目标输出更新编辑:

这是我在最简单的情况下要寻找的输出:

B

计算独特的群体会产生相当于:

的东西

{1: [10, 10], 2: [10, 10], 3: [11, 15]}

2 个答案:

答案 0 :(得分:2)

怎么样:

>>> df = pd.DataFrame({'A': [1,2,3,1,2,3], 'B': [10,10,11,10,10,15]})
>>> df.groupby("A")["B"].apply(tuple).value_counts()
(10, 10)    2
(11, 15)    1
dtype: int64

或者

>>> df.groupby("A")["B"].apply(lambda x: tuple(sorted(x))).value_counts()
(10, 10)    2
(11, 15)    1
dtype: int64

如果你不关心小组内的顺序。

如果您愿意,可以简单地拨打.to_dict(),例如

>>> df.groupby("A")["B"].apply(tuple).value_counts().to_dict()
{(11, 15): 1, (10, 10): 2}

答案 1 :(得分:1)

也许:

>>> df.groupby('A')['B'].aggregate(lambda ts: list(ts.values)).to_dict()
{1: [10, 10], 2: [10, 10], 3: [11, 15]}

用于计算您需要转换为tuple的组,因为列表不可清除:

>>> ts = df.groupby('A')['B'].aggregate(lambda ts: tuple(ts.values))
>>> ts.value_counts().to_dict()
{(11, 15): 1, (10, 10): 2}