问题
“如何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表格以供业务使用。
目前已尝试
提出了类似的问题:
Add percent of total column to Pandas pivot_table
Pandas percentage of total with groupby
此外,我希望大熊猫可以通过最新版本找到一个巧妙的方法,所以我们可以使用df.pivot_table
来做到这一点。他们通常会为迭代添加一些方便的改进。 :)
的规格
Python:3.5.2
熊猫:0.18.1
Numpy:1.11.1
答案 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