有人可以建议一种简单的方法来实现下面的结果。
数据:
data = np.array([
['','A','B'],
['Yes',44,19],
['No',116,128]
])
df = pd.DataFrame(data=data[1:,1:],
index=data[1:,0],
columns=data[0,1:])
df:
A B
Yes 44 19
No 116 128
对于每个单元格,我想将行总数的总和乘以列总数并除以表格总数(此时我不关心调用的值),因此单元格是\ A将是:
63 * 160/307 = 32.83
这些值来自:
63 = 44 + 19
160 = 44 + 116
307 = 44 + 19 + 116 + 128
任何简单的方法吗?
谢谢
编辑。 完整的期望结果(此外,无论数据框中的行数和列数如何,此方法都应该有效...可能会有所不同)
32.83 30.17
127.17 116.83
答案 0 :(得分:3)
您可以DataFrame.dot
和sum
使用to_frame
创建的T
Dataframes
{/ 3}}
Series
<强>计时强>:
df = df.astype(int)
print (df.sum(1).to_frame())
0
Yes 63
No 244
print (df.sum().to_frame())
0
A 160
B 147
print (df.sum(1).to_frame().dot(df.sum().to_frame().T).div(df.sum().sum()))
A B
Yes 32.833876 30.166124
No 127.166124 116.833876
答案 1 :(得分:2)
首先,您要将DataFrame中的值转换为整数(或浮点数):table.overzicht{
max-width: 600px;
min-width: 600px;
border-collapse: collapse;
}
.overzicht td{
padding: 10px;
text-align: center;
vertical-align:center;
border:0px;
}
.overzicht td h2{
margin: 0;
}
。
然后,您可以使用df=df.applymap(int)
函数获取每列和每行的总和。
您将在这里丢失DataFrame的形状(您最终会得到两个1-D阵列),因此需要重建。
然后你可以加上两个并除以总和。
所有这些共同给出了:
.sum()
这导致:
df= df.applymap(int)
rowsums = pd.concat([df.sum(axis=1)] * 2, ignore_index=True, axis=1)
colsums = pd.concat([df.sum(axis=0)] * 2, ignore_index=True, axis=1).transpose()
colsums.index = rowsums.index
rowsums.columns = colsums.columns
newdata = colsums * rowsums
newdata = newdata.divide(df.sum().sum())
答案 2 :(得分:2)
与上述解决方案相比,这种解决方案的优点在于它适用于一行,但我担心它可能会在它结束的地方。
df.apply(lambda r: df.sum()[r.name]*df.sum(1)[r.index]/df.sum().sum())
答案 3 :(得分:1)
真的很棘手:
我的(可能不是最理想的解决方案):
import numpy as np
import pandas as pd
data = np.array([
['','A','B'],
['Yes',44,19],
['No',116,128]
])
df = pd.DataFrame(data=data[1:,1:],
index=data[1:,0],
columns=data[0,1:]).apply(pd.to_numeric,axis=0)
orig = df.copy()
df['rowsum']=df.sum(axis=1)
df.loc['colsum',:]=df.sum(axis=0)
rowsums = df.copy()
rowsums['A'] = rowsums['rowsum']
rowsums['B'] = rowsums['rowsum']
colsums = df.copy()
colsums.loc['Yes',:] = colsums.loc['colsum',:]
colsums.loc['No',:] = colsums.loc['colsum',:]
print(rowsums.multiply(colsums).div(orig.sum().sum()))
结果:
A B rowsum
Yes 32.833876 30.166124 63.0
No 127.166124 116.833876 244.0
colsum 160.000000 147.000000 307.0