繁体   English   中英

通过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做到这一点(因为我正在学习熊猫,并且想利用其内在功能)。

我试图做类似的事情:

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分数,计算变异系数等),但是选择哪种方法取决于您的数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM