【问题标题】:Application of different functions to Pandas columns via Groupby通过 Groupby 对 Pandas 列应用不同的功能
【发布时间】:2017-06-19 00:49:53
【问题描述】:

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

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

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案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-score、计算变异系数等),但选择哪一个取决于您的数据集。

    【讨论】:

    • 字典是关键!太好了,感谢您的回答和详细的 cmets。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2018-01-11
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多