Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:根据群体的不同进行聚合_Python_Pandas_Dataframe_Aggregation - Fatal编程技术网

Python 熊猫:根据群体的不同进行聚合

Python 熊猫:根据群体的不同进行聚合,python,pandas,dataframe,aggregation,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 然后我将分组,

假设我有一些数据如下:

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\u id','lab\u type')

之后,我想在
值上进行聚合,但每个
实验室类型不同。在
food
上,我想使用
mean
进行聚合,在
shot
上,我想使用
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)
这个问题的答案看起来很有希望。从这一点开始,我提出了以下代码,应该适合您

测试数据:

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

p
成为您的数据帧

P[P.lab_type =="food"].groupby(['patient_id']).aggregate(np.avg)
对于
shot
组和结果也是如此

在食物上,我想用平均数来聚合,在镜头上,我想用总和来聚合

只需使用
。应用
并传递自定义函数:

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)
此处
calc
接收如中所示的每组数据帧。因此,您可以得到您想要的:

patient_id  lab_type
1           food         9
            shot        14
2           food         4
            shot         6
dtype: float64
我尝试修改答案:

您可以使用和,然后使用:


只需编写一个函数,检查其输入的
labu类型
,并根据输入的内容执行不同的操作,然后
将该函数应用于groupby。不过,您的答案似乎是最简洁的,您能解释一下g在本例中指的是什么以及需要返回什么吗?
calc
为每个组调用一次,
g
指的是组中的数据(实际上是一个数据帧)。返回值是您应用的任何操作的结果,在本例中,它是计算的统计数据。本质上,Pandas自动连接所有结果。这是一个可靠的答案,但与mira的答案相比有点冗长。
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