【问题标题】:Find difference between groupby values for specific categories in Pandas查找 Pandas 中特定类别的 groupby 值之间的差异
【发布时间】:2023-01-16 22:15:04
【问题描述】:

我想找到 Pandas groupby 数据框中值之间的差异,但对于特定的列值。我已经阅读了多篇关于使用 diff 命令的文章,但无论分组如何,这都适用于后续行。

在下面的数据框中(它是一个字典),数据框包含用户 ID trial_id 的列、条件 placebovstreatment、主持人变量 expbin 和一个值。

我想计算用户内部值之间的差异,但前提是他们具有某些条件类别的值。

例如,用户 1 的值为

correct_placebo_baseline    10.000
correct_treatment   21.000

差值是 11。

用户 2 的值为

0   22.000
correct_placebo_baseline 8.688

差异大约为 14。

用户 1 在列类别 correct_placebo_baselinecorrect_treatment 之间存在差异。用户 2 在 correct_placebo_baseline 和类别“0”之间存在差异。

仅当用户同时具有 correct_placebo_baseline 和 'correct_treatment' 分组时,我该如何计算?或者,您如何创建列,其中每个用户每个组的差异是特定的?

该公式可以为每个 trial_id 创建列 difference from baseline for correct placebo 和“与基线的差异为 0”。

挑战在于一些用户没有基准分数。一些用户有一个基线分数,但没有别的。仅当它们同时具有两者时,我才需要差异值。

我试图找到一种方法来在 groupby 类别满足特定条件时运行函数,但没有成功。

感谢您的帮助,如果我能让这个问题更容易回答,请告诉我。

{'trial_id': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 3, 7: 4, 8: 4, 9: 5},
 'placebovstreatment': {0: '0',
  1: 'correct_placebo_baseline',
  2: 'correct_treatment',
  3: '0',
  4: 'correct_placebo_baseline',
  5: 'correct_placebo_baseline',
  6: 'incorrect_placebo',
  7: 'correct_placebo_baseline',
  8: 'incorrect_placebo',
  9: '0'},
 'expbin': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2, 6: 2, 7: 1, 8: 1, 9: 1},
 'value': {0: 31.5,
  1: 10.0,
  2: 21.0,
  3: 22.0,
  4: 8.688,
  5: 20.0,
  6: 37.5,
  7: 12.0,
  8: 32.5,
  9: 10.0}}

【问题讨论】:

  • 为了清楚起见,您能否提供预期的输出?

标签: pandas group-by


【解决方案1】:

您可以使用 groupby 方法按 'user_id' 列对数据帧进行分组,然后使用 transform 方法创建新列,每个组中的值不同。要仅在用户同时具有“correct_placebo_baseline”和“correct_treatment”分组时计算差异,您可以使用 any 方法检查该组是否具有这两个值。这是您如何执行此操作的示例

df = pd.DataFrame(data)
df['difference_placebo_treatment'] = df.groupby('user_id')['value'].transform(lambda x: x.diff())
df['has_both_placebo_treatment'] = df.groupby('user_id')['placebovstreatment'].transform(lambda x: x.eq('correct_placebo_baseline').any() & x.eq('correct_treatment').any())
df['difference_placebo_baseline'] = np.where(df['has_both_placebo_treatment'], df.groupby(['user_id', 'placebovstreatment'])['value'].transform(lambda x: x.diff()), np.nan)

此代码首先创建一个新列“difference_placebo_treatment”,其中包含每个“user_id”组中的值差异。然后它创建一个新列“has_both_placebo_treatment”,检查该组是否同时具有“correct_placebo_baseline”和“correct_treatment”值。最后,它创建一个新列“difference_placebo_baseline”,仅当“has_both_placebo_treatment”列为 True 时才计算差异,否则将为 NaN。

【讨论】:

    【解决方案2】:

    您可以pivot 获取列的条件:

    df2 = df.pivot(index=['trial_id', 'expbin'], columns='placebovstreatment', values='value')
    

    输出:

    placebovstreatment     0  correct_placebo_baseline  correct_treatment  incorrect_placebo
    trial_id expbin                                                                         
    1        1          31.5                    10.000               21.0                NaN
    2        2          22.0                     8.688                NaN                NaN
    3        2           NaN                    20.000                NaN               37.5
    4        1           NaN                    12.000                NaN               32.5
    5        1          10.0                       NaN                NaN                NaN
    

    然后您可以轻松地执行计算:

    df2['correct_treatment'] - df2['correct_placebo_baseline']
    

    输出:

    trial_id  expbin
    1         1         11.0
    2         2          NaN
    3         2          NaN
    4         1          NaN
    5         1          NaN
    dtype: float64
    

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2019-05-17
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多