我想对某些数据执行聚合,但一旦完成,就将聚合链接回构成聚合的行。
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行组成。
非常感谢您的帮助, 马库斯
答案 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