【问题标题】:Calculate conditional probabilities in pandas计算熊猫中的条件概率
【发布时间】:2022-11-14 16:27:06
【问题描述】:

我试图在聚合我的数据集时计算条件响应概率。以以下玩具示例为例:

import pandas as pd

gender = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1]
is_family = [0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1]
treatment = [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
response = [1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1]
num_rows = [10,10,5,20,0,5,10,30,20,30,10,5,60,10,10,20]

df = pd.DataFrame(data={'gender': gender, 'is_family': is_family, 'treatment': treatment, 'response': response, 'num_rows': num_rows})
    gender  is_family  treatment  response  num_rows
0        0          0          0         1        10
1        0          0          1         0        10
2        0          0          0         0         5
3        0          0          1         1        20
4        0          1          0         1         0
5        0          1          1         0         5
6        0          1          0         0        10
7        0          1          1         1        30
8        1          0          0         1        20
9        1          0          1         0        30
10       1          0          0         0        10
11       1          0          1         1         5
12       1          1          0         1        60
13       1          1          1         0        10
14       1          1          0         0        10
15       1          1          1         1        20

当按gender、treatment 和response 进行分组和聚合时,我想(1)对每组的行数求和,(2)计算给定治疗的响应概率。结果应该是这样的

   gender  treatment  response  num_rows  resp_prob
0       0          0         0        15   0.600000
1       0          0         1        10   0.400000
2       0          1         0        15   0.230769
3       0          1         1        50   0.769231
4       1          0         0        20   0.200000
5       1          0         1        80   0.800000
6       1          1         0        40   0.615385
7       1          1         1        25   0.384615

第一响应概率计算如下:15(响应=0,治疗=0)/25(治疗=0)=0.6。第三个响应概率计算如下:15 / 65 = 0.23。等等。

我可以总结每组的样本数量:

df.groupby(by=['gender', 'treatment', 'response'])['num_rows'].sum().reset_index()

但是概率呢?

有任何想法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,使用双组:

    (df.groupby(by=['gender', 'treatment', 'response'],
                as_index=False)
       ['num_rows'].sum()
       .assign(resp_prob=lambda d: d['num_rows'].div(
                                    d.groupby(['gender', 'treatment'])
                                    ['num_rows'].transform('sum'))
              )
    )
    

    输出:

       gender  treatment  response  num_rows  resp_prob
    0       0          0         0        15   0.600000
    1       0          0         1        10   0.400000
    2       0          1         0        15   0.230769
    3       0          1         1        50   0.769231
    4       1          0         0        20   0.200000
    5       1          0         1        80   0.800000
    6       1          1         0        40   0.615385
    7       1          1         1        25   0.384615
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      df["resp_prob"] = df["num_rows"].div(
          df.groupby(["gender", "treatment"])["num_rows"].transform("sum")
      )
      

      所以你所需要的只是每个性别、治疗的总数,然后你已经知道num_rows形式的个人总数,所以你得到每个人的概率为num_rows/total

      输出:

         gender  treatment  response  num_rows  resp_prob
      0       0          0         0        15   0.600000
      1       0          0         1        10   0.400000
      2       0          1         0        15   0.230769
      3       0          1         1        50   0.769231
      4       1          0         0        20   0.200000
      5       1          0         1        80   0.800000
      6       1          1         0        40   0.615385
      7       1          1         1        25   0.384615
      

      【讨论】:

        【解决方案3】:
        def function1(dd:pd.DataFrame):
            return dd.to_frame('num_rows').assign(resp_prob=dd/dd.sum())
        
        df.groupby(by=['gender', 'treatment', 'response'])['num_rows'].sum()
            .groupby(level=[0,1]).apply(function1).reset_index()
        
           gender  treatment  response  num_rows  resp_prob
        0       0          0         0        15   0.600000
        1       0          0         1        10   0.400000
        2       0          1         0        15   0.230769
        3       0          1         1        50   0.769231
        4       1          0         0        20   0.200000
        5       1          0         1        80   0.800000
        6       1          1         0        40   0.615385
        7       1          1         1        25   0.384615
        

        【讨论】:

          猜你喜欢
          • 2016-04-12
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多