计算数据框中每一行的概率
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
假设我们有以下数据框,并想计算 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