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

Application of different functions to Pandas columns via 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 来做(因为我正在学习 pandas 并且想使用它的内在功能)。

我尝试做类似的事情:

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. 我的解决方案有什么问题?

当您将函数列表传递给 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 分数、计算变异系数等),但选择哪一个取决于您的数据集。