计算数据框中每一行的概率
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 校正计算数据框中每一行的超几何测试