计算数据框中每一行的概率

Computing probability for each row in a dataframe

假设我们有以下数据框,并想计算 B 和 C 之间频率的概率。

data = pd.DataFrame({'id_' : [1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010],
        'A' : [1608, 1608, 2089, 213, 1005, 1887, 2089, 4544, 6866, 2020, 2020],
                   'B' : [1772, 1772, 1608, 1608, 1790, 1790, 1791, 1791, 1772, 1799, 1799],
                        'C': [1772,1608, 1005,1791, 4544, 2020, 1791, 1772, 1799, 2020, 213],
                       })

我有 运行 交叉表来计算 B 和 C 的频率:

df = pd.crosstab(data['B'], data['C'])
print(df)

C     213   1005  1608  1772  1791  1799  2020  4544
B                                                   
1608     0     1     0     0     1     0     0     0
1772     0     0     1     1     0     1     0     0
1790     0     0     0     0     0     0     1     1
1791     0     0     0     1     1     0     0     0
1799     1     0     0     0     0     0     1     0

现在我想按元素计算每一行的概率,以便输出如下所示:

        213   1005  1608  1772  1791  1799  2020  4544                                                  
1608     0    0.5    0     0     0.5   0     0     0
1772     0     0     0.33  0.33  0     0.33  0     0
1790     0     0     0     0     0     0     0.5   0.5
1791     0     0     0     0.5   0.5   0     0     0
1799     0.5   0     0     0     0     0     0.5   0

我尝试了以下方法:

prob = [i/sum(i) for i in range(df)]

我得到了这个错误:

TypeError: 'DataFrame' object cannot be interpreted as an integer

我在此处阅读了错误 why-does-dataframe-object-cannot-be-interpreted-as-an-integer 我试着听从建议,但没有用。我还在这里 阅读了另一个解决方案,它适用

df.iloc[:, 1:].apply(lambda x: x / x.sum())

但是我得到的概率并不准确

如果有另一种无需交叉表即可获得概率的方法,那也会有所帮助。

您需要这样做:

pd.crosstab(data.B,data.C, normalize='index').round(4)*100

给出:

C     213   1005   1608   1772  1791   1799  2020  4544
B                                                      
1608   0.0  50.0   0.00   0.00  50.0   0.00   0.0   0.0
1772   0.0   0.0  33.33  33.33   0.0  33.33   0.0   0.0
1790   0.0   0.0   0.00   0.00   0.0   0.00  50.0  50.0
1791   0.0   0.0   0.00  50.00  50.0   0.00   0.0   0.0
1799  50.0   0.0   0.00   0.00   0.0   0.00  50.0   0.0

print(pd.crosstab(data.B,data.C, normalize='index').round(2))

即:

C     213   1005  1608  1772  1791  1799  2020  4544
B                                                   
1608   0.0   0.5  0.00  0.00   0.5  0.00   0.0   0.0
1772   0.0   0.0  0.33  0.33   0.0  0.33   0.0   0.0
1790   0.0   0.0  0.00  0.00   0.0  0.00   0.5   0.5
1791   0.0   0.0  0.00  0.50   0.5  0.00   0.0   0.0
1799   0.5   0.0  0.00  0.00   0.0  0.00   0.5   0.0