查找Pandas中特定类别的groupby值之间的差异

qmelpv7a  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(130)

我想找出Pandas groupby Dataframe 中的值之间的差异,但针对特定的列值。我读过很多关于使用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 categories满足某些条件时运行函数,但没有成功。
谢谢你的帮助,如果我能让这个问题更容易回答,请告诉我。

{'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}}
yeotifhr

yeotifhr1#

您可以使用groupby方法按“user_id”列对 Dataframe 进行分组,然后使用transform方法创建具有每个组内的差值的新列。要仅在用户同时具有“correct_soluberate_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_solubo_baseline”和“correct_treatment”值。最后,它创建了一个新列“difference_placebine_baseline”,仅当"has_both_placebine_treatment“列为True时才计算差异,否则将为NaN。

kuarbcqp

kuarbcqp2#

您可以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

相关问题