【发布时间】: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())
但我得到的概率并不准确。
如果有另一种方法可以在没有交叉表的情况下获得概率,那也会很有帮助。
【问题讨论】:
标签: python pandas lambda probability crosstab