【问题标题】:Selecting values from dataframe based on multiple column values根据多列值从数据框中选择值
【发布时间】:2022-01-18 17:50:30
【问题描述】:

我有一个这种格式的数据框:

ageClass sex nationality treatment unique_id netTime clockTime
0 20 M KEN Treatment 354658649da56c20c72b6689d2b7e1b8cc334ac9 7661 7661
1 20 M KEN Treatment 1da607e762ac07eba6f9b5a717e9ff196d987242 7737 7737
2 20 M KEN Control 1de4a95cef28c290ba5790217288f510afc3b26b 7747 7747
3 30 M KEN Control 12215d93d2cb5b0234991a64d097955338a73dd3 7750 7750
4 30 M KEN Treatment 5375986567be20b49067956e989884908fb807f6 8163 8163
5 20 M ETH Treatment 613be609b3f4a38834c2bc35bffbdb6c47418666 7811 7811
6 20 M KEN Control 70fb3284d112dc27a5cad7f705b38bc91f56ecad 7853 7853
7 30 M AUS Control 0ea5d606a83eb68c89da0a98543b815e383835e3 7902 7902
8 20 M BRA Control ecdd57df778ad901b41e79dd2713a23cb8f13860 7923 7923
9 20 M ETH Control ae7fe893268d86b7a1bdb4489f9a0798797c718c 7927 7927

目标是根据时钟时间来确定哪个年龄段的人从治疗组中受益最多。 这意味着我需要以某种方式将每个年龄组中成员的所有值分组为治疗和控制条件,并取他们的时钟时间的平均值。 然后,我需要获取子组的平均时钟时间的差异,并将所有这些时间相互比较。

我卡住的地方是同时基于多列过滤数据帧。我尝试使用 groupby() 如下:

df.groupby(['ageClass','treatment'])['clockTime'].mean()

但是我无法计算结果系列的平均时间差。

我应该如何前进?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby preprocessor


    【解决方案1】:

    您可以使用您制作的方式旋转表格

    df2 = df.groupby(['ageClass','treatment'])[['clockTime']].mean().reset_index().pivot(columns=['ageClass'], values='clockTime', index='treatment')
    
    ageClass    20  30
    treatment       
    Control     7862.500000     7826.0
    Treatment   7736.333333     8163.0
    

    那么就很容易找到区别了

    df2['diff'] = df2[20] - df2[30]
    
    treatment
    Control       36.500000
    Treatment   -426.666667
    Name: diff, dtype: float64
    

    【讨论】:

      【解决方案2】:

      从您已经完成的groupby,您可以groupby 索引级别0,即'ageClass',然后使用diff 查找每个'ageClass' 的治疗组和对照组的平均值之间的差异.由于diff 从第一个中减去第二个(并且“控制”和“治疗”按字母顺序排序),添加"-Control" 使其更清晰。

      s = df.groupby(['ageClass','treatment'])['clockTime'].mean()
      out = s.groupby(level=0).diff().dropna().reset_index()
      out = out.assign(treatment=out['treatment']+'-Control')
      

      输出:

         ageClass          treatment   clockTime
      0        20  Treatment-Control -126.166667
      1        30  Treatment-Control  337.000000
      

      【讨论】:

        【解决方案3】:

        根据您的问题描述,我会规定排名。群体之间的差异并不能说明谁受益最多

        s=df.groupby(['ageClass','treatment'])['clockTime'].agg('mean').reset_index()
        
        s['rank']=s.groupby('ageClass')['clockTime'].rank()
        
        
        
            ageClass  treatment    clockTime  rank
        0        20    Control  7862.500000   2.0
        1        20  Treatment  7736.333333   1.0
        2        30    Control  7826.000000   1.0
        3        30  Treatment  8163.000000   2.0
        

        【讨论】:

          猜你喜欢
          • 2021-07-23
          • 2020-03-20
          • 2018-08-05
          • 2015-10-23
          相关资源
          最近更新 更多