使用groupby创建新数据帧,而不必对该groupby对象应用任何计算

时间:2017-01-20 22:04:58

标签: python pandas group-by

我希望对此数据框进行分组,以便price_1和price_2位于同一行,然后我想使用类似reset_index的内容而不对分组对象应用任何计算并创建新数据框然后将价格1添加到价格2 。

在我看来,我试图做一些类似sql的事情,我使用子查询来应用我的groupby,然后对其进行计算。

在python中,groupbys以一种强制你创建多个组然后将它们重新组合在一起的方式工作,但我希望将较大的数据帧减少到item_number,prod_name和comp共享的位置并使用该新数据帧然后运行一些计算。

另一种看待这种情况的方法可能是在组内添加这些列,并创建一个新的列,然后以某种方式将其重新组合在一起。

d = {
'item_number':[1234,56789,2468,1234,56789,2468],
'prod_name':['prod_a','prod_b','prod_c','prod_a','prod_b','prod_c'],
'comp':['comp_a','comp_b','comp_c','comp_a','comp_b','comp_c'],
'price_1':[20.00,16.69,36.21,0,0,0],
'price_2':[0,0,0,5,7,3.69]}

df = pd.DataFrame(data=d)

期望的输出:

d = {
'item_number':[1234,56789,2468],
'prod_name':['prod_a','prod_b','prod_c'],
'comp':['comp_a','comp_b','comp_c'],
'price_1':[20.00,16.69,36.21,0,0,0],
'price_2':[5,7,3.69]}

df = pd.DataFrame(data=d)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这可能就是你要找的东西:

print(df.groupby(['item_number', 'comp'])['price_1', 'price_2'].sum())

输出:

                      price_1  price_2
item_number comp                    
1234        comp_a    20.00     5.00
2468        comp_c    36.21     3.69
56789       comp_b    16.69     7.00

如果您希望将其作为新数据框并对价格列值求和,则可以执行以下操作:

new_df = df.groupby(['item_number', 'comp'])['price_1', 'price_2'].sum()
new_df['total'] = new_df.price_1 + new_df.price_2
print(new_df)

输出:

                      price_1  price_2  total
item_number comp                           
1234        comp_a    20.00     5.00  25.00
2468        comp_c    36.21     3.69  39.90
56789       comp_b    16.69     7.00  23.69