熊猫:基于群体的聚合方式不同

时间:2016-01-24 20:27:55

标签: python pandas dataframe aggregation

所以,让我说我有一些数据如下:

patient_id  lab_type  value
1           food       10
1           food       8
2           food       3
2           food       5
1           shot       4
1           shot       10
2           shot       2
2           shot       4

然后我将分组groupby(['patient_id', 'lab_type'])

等内容

之后,我想在value上进行汇总,但每个lab_type都有所不同。在food我希望使用meanshot进行汇总,我希望使用sum汇总。

最终数据应如下所示:

  patient_id  lab_type  value
  1           food       9 (10 + 8 / 2)
  2           food       4 (3 + 5 / 2)
  1           shot       14 (10 + 4)
  2           shot       6 (2 + 4)

4 个答案:

答案 0 :(得分:1)

  

关于食物,我想使用平均值和镜头进行聚合,我希望使用总和进行聚合。

只需使用label_i并传递自定义功能:

.apply

此处def calc(g): if g.iloc[0].lab_type == 'shot': return sum(g.value) else: return np.mean(g.value) result = df.groupby(['patient_id', 'lab_type']).apply(calc) 接收每组数据框,如Panda's split-apply-combine所示。结果你得到了你想要的东西:

calc

答案 1 :(得分:1)

我尝试修改john回答:

您可以使用meansum,然后concat使用reset_index

print df
   patient_id lab_type  value
0           1     food     10
1           1     food      8
2           2     food      3
3           2     food      5
4           1     shot      4
5           1     shot     10
6           2     shot      2
7           2     shot      4


df1 = df[df.lab_type =="food"].groupby(['patient_id']).mean()
df1['lab_type'] = 'food'
print df1
            value lab_type
patient_id                
1               9     food
2               4     food

df2 = df[df.lab_type =="shot"].groupby(['patient_id']).sum()
df2['lab_type'] = 'shot'
print df2
            value lab_type
patient_id                
1              14     shot
2               6     shot

print pd.concat([df1, df2]).reset_index()
   patient_id  value lab_type
0           1      9     food
1           2      4     food
2           1     14     shot
3           2      6     shot

答案 2 :(得分:0)

this post中的答案看起来很有希望。从这开始,我想出了下面的代码,它应该适合你。

TESTDATA:

data = [{"A" : 1, "B" : "food", "C" : 10},
{"A" : 1, "B" : "food", "C" : 8},
{"A" : 2, "B" : "food", "C" : 3},
{"A" : 2, "B" : "food", "C" : 5},
{"A" : 1, "B" : "shot", "C" : 4},
{"A" : 1, "B" : "shot", "C" : 10},
{"A" : 2, "B" : "shot", "C" : 2},
{"A" : 2, "B" : "shot", "C" : 4}]    
df = pd.DataFrame(data)

实际代码:

res = df.groupby(['A', 'B']).apply(
  lambda x: pd.Series(
    {"value" : x.C.mean() if x.iloc[0].B == "food" else x.C.sum()}
  )
)

这导致

        value
A B          
1 food      9
  shot     14
2 food      4
  shot      6

答案 3 :(得分:0)

P成为您的DataFrame。

P[P.lab_type =="food"].groupby(['patient_id']).aggregate(np.avg)

,同样适用于shot组和concatenate结果。