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

Posted

技术标签:

【中文标题】计算数据框中每一行的概率【英文标题】:Computing probability for each row in a dataframe 【发布时间】:2022-01-07 00:35:10 【问题描述】:

假设我们有以下数据框,并且想要计算 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 我尝试按照建议进行操作,但没有奏效。我还在这里阅读了另一个解决方案Compute percentage for each row in pandas,它适用

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

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

如果有另一种方法可以在没有交叉表的情况下获得概率,那也会很有帮助。

【问题讨论】:

【参考方案1】:

您需要这样做:

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

【讨论】:

以上是关于计算数据框中每一行的概率的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bonferroni 校正计算数据框中每一行的超几何测试

删除熊猫数据框中每一行的标点符号[重复]

如何计算熊猫数据框中每一列的唯一性?

如何计算熊猫数据框中每组的行数并将其添加到原始数据中

如何使用 SQL 数据库计算 DataGridView 中每一行的总金额

数据框中每日数据与工作日和周末平均值的偏差