通过Groupby将不同函数应用于Pandas列

时间:2017-06-18 16:29:13

标签: python pandas pandas-groupby

我需要计算沿列的标准偏差(轴= 0),但由于两列具有不同的范围(q1_5 = [0 - 15],q6_9 = [0-4]),我必须按最大值归一化。值(列q1_5乘15和列q6_9乘4)

      q1_5  q6_9  participant_id
0      2.0   0.0              11
1      3.0   0.0              11
2      3.0   0.0              11
3      3.0   0.0              11
4      3.0   0.0              11
183    2.0   0.0              14
184    3.0   0.0              14
185    2.0   0.0              14
186    3.0   0.0              14
187    3.0   0.0              14
358    5.0   0.0              17
359    5.0   0.0              17
360    3.0   0.0              17
361    4.0   0.0              17
362    4.0   0.0              17
535    4.0   0.0              18
536    5.0   0.0              18
537    4.0   0.0              18
538    3.0   0.0              18
539    3.0   0.0              18

我想用GroupBy做这件事(因为我正在学习熊猫并想要使用它的内在功能)。

我尝试过这样的事情:

df.groupby('participant_id').agg([lambda x: (x.q1_5/15.0).std(), lambda x: (x.q6_9/4.0).std()])

但它没有用。

AttributeError: 'Series' object has no attribute 'q1_5'

问题

  1. 要比较两个不同范围的数组的std(),我应该先规范化吗?
  2. 我的解决方案有什么问题?

1 个答案:

答案 0 :(得分:1)

当您将函数列表传递给groupby.agg而不切片列时,它会遍历DataFrame中的所有列(分组列除外)并应用这些函数。因此,它从lambda x: (x.q1_5/15.0).std()开始,它会尝试将其应用于列q1_5,但您的代码会转换为df['q1_5']['q1_5']。相反,如果要为不同的列指定不同的函数,则需要使用字典:

df.groupby('participant_id').agg({'q1_5': lambda x: (x/15.).std(), 
                                  'q6_9': lambda x: (x/4.).std()})
Out: 
                q6_9      q1_5
participant_id                
11               0.0  0.029814
14               0.0  0.036515
17               0.0  0.055777
18               0.0  0.055777

对于具有不同范围的数据,有许多标准化选项(最小 - 最大,z分数,计算变异系数等),但选择哪一个取决于您的数据集。