我想从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]}
答案 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}