2

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

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 行组成。

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

4

2 回答 2

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')
于 2013-09-17T10:41:44.483 回答
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
于 2013-09-17T22:38:10.113 回答