将行和列总和应用于pandas数据框

时间:2016-11-24 12:18:57

标签: python pandas dataframe

有人可以建议一种简单的方法来实现下面的结果。

数据:

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

4 个答案:

答案 0 :(得分:3)

您可以DataFrame.dotsum使用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