Python:Pandas:每列的百分比

时间:2016-10-23 17:58:48

标签: python pandas

问题
“如何pd.pivot_table与%(百分比)列,其中总和/总数由df.pivot_table(margins=True)提供”

上下文
我们有一个示例支点:

import pandas as pd
import numpy as np

df = pd.DataFrame([["row1",50, 200],["row2",100, 300]], columns=list('ABC'))

print(df)
print("\n\n")
pivot = df.pivot_table(
    index=["A"],
    columns=[],
    values=["B", "C"],
    aggfunc={
        "B": np.sum,
        "C": np.sum,
    },
    margins=True,
    margins_name = "Total",
    fill_value=0

)

print(pivot)

像这样:

        B   C
A            
row1   50 200
row2  100 300
Total 150 500


期望输出

        B   C   D     E
A            
row1   50 200   250   38.46%
row2  100 300   400   61.54%
Total 150 500   650   100%

简而言之,我们基本上希望将列E (pct of row & column total)添加到pivot_table的输出中,该列是列总数的百分比。

注意,为了使示例更具可读性,我们添加了列'D',它不应该是实际输出的一部分。

除此之外,输出格式必须保持这样,因此最终我们会将其输出到Excel表格以供业务使用。

目前已尝试
提出了类似的问题:


此外,我希望大熊猫可以通过最新版本找到一个巧妙的方法,所以我们可以使用df.pivot_table来做到这一点。他们通常会为迭代添加一些方便的改进。 :)

规格
Python:3.5.2
熊猫:0.18.1
Numpy:1.11.1

2 个答案:

答案 0 :(得分:0)

你可以这样做:

df = pd.DataFrame([["row1",50, 200],["row2",100, 300]], columns=list('ABC'))
df = df.set_index('A')
df['E'] = df.apply(lambda x: x/df.sum().sum()).sum(axis=1)
df.loc['Total'] = df.sum()
In[52]: df
Out[52]: 
           B      C         E
A                            
row1    50.0  200.0  0.384615
row2   100.0  300.0  0.615385
Total  150.0  500.0  1.000000

,其中

df.apply(lambda x: x/df.sum().sum())

通过df.sum()。sum()来表示每个元素,它是所有元素的总和。

.sum(axis=1)

对每一行求和

df.loc['Total']

允许您使用您喜欢的任何内容填充新行

答案 1 :(得分:0)

受到Steven G的方法的启发,这个解决方案对我有用:

import pandas as pd
import numpy as np

df = pd.DataFrame([["row1",50, 200],["row2",100, 300]], columns=list('ABC'))


#print(df)
print("\n\n")
pivot = df.pivot_table(
    index=["A"],
    columns=[],
    values=["B", "C"],
    aggfunc={
        "B": np.sum,
        "C": np.sum,

    },
    margins=True,
    margins_name = "Total",
    fill_value=0

)
print(pivot)

a = pd.DataFrame(pivot.ix["Total"]).transpose()["B"].values

pivot["E"] = pivot["B"].apply(lambda x: round(x/float(a), 2))

print(pivot)


输出

           B      C     E
A                        
row1    50.0  200.0  0.33
row2   100.0  300.0  0.67
Total  150.0  500.0  1.00