Pandas - 将聚合行链接回其原始元素

时间:2013-09-16 22:37:25

标签: python pandas aggregation linkage

我想对某些数据执行聚合,但一旦完成,就将聚合链接回构成聚合的行。

df = pd.DataFrame({"vehicle":  ['car','bus','bus' ,'car','bus'],
               "colour" :  ['red','red','blue','red','blue'],
               "weight" :  [ 1,    14,   10,    2,    12]
            })

grouped = df.groupby(["vehicle", "colour"], as_index=False)
print grouped.agg({"weight":"sum"})

vehicle colour  weight
0     bus   blue      22
1     bus    red      14
2     car    red       3

假设我想显示聚合,我可以遍历上面的聚合数据。 但是,我还希望能够确定/显示构成任何给定聚合的行。即我需要能够有效地确定红色汽车聚合,由原始数据集中的第0行和第3行组成

最终我想将这种关系保存到文件中 - 但我不确定这是否可以在一个组合数据集中完成,或者我是否需要两个单独的数据集 - 以一种链接任何给定聚合的方式回到原始数据中的行

我的主要问题是 - 如何确定红色汽车= 3,由原始数据集中的第0行和第3行组成。

非常感谢您的帮助, 马库斯

2 个答案:

答案 0 :(得分:0)

您可以在原始数据框与生成的汇总数据之间应用join操作:

key_cols = ["Date", "TextA", "TextB"]
grouped = data.groupby(key_cols)
data.join(grouped.agg({"NumberA":"sum", "NumberB": "min"}), on=key_cols, rsuffix='_agg')

答案 1 :(得分:0)

您可以使用群组词典:

In [11]: grouped.groups[('car', 'red')]
Out[11]: [0, 3]

In [12]: df.loc[grouped.groups[('car', 'red')]]
Out[12]:
  colour vehicle  weight
0    red     car       1
3    red     car       2

你必须要小心,因为一般来说这会返回标签(而不是整数位置)。
因为它使用标签,这个解决方案失败了重复索引,所以使用索引字典(使用整数位置)可能更好:

In [21]: df.index = list('abcdd')

看到上述解决方案失败(由于索引中的重复):

In [22]: grouped.groups[('car', 'red')]
Out[22]: ['a', 'd']

In [23]: df.loc[grouped.groups[('car', 'red')]]
Out[23]:
  colour vehicle  weight
a    red     car       1
d    red     car       2
d   blue     bus      12

但是使用索引(整数位置)它可以正常工作:

In [24]: grouped.indices[('car', 'red')]
Out[24]: array([0, 3])

In [25]: df.iloc[grouped.indices[('car', 'red')]]
Out[25]:
  colour vehicle  weight
a    red     car       1
d    red     car       2