gpt4 book ai didi

python - 获取 Pandas 数据透视表中另一列的百分比

转载 作者:行者123 更新时间:2023-11-28 21:58:09 25 4
gpt4 key购买 nike

我正在尝试在 pandas 中获得类似的 excel 功能,主要是 % 的类型行为。使用以下数据:

{'A': ['a', 'b', 'b', 'a', 'a', 'a', 'b', 'b', 'b', 'a', 'a', 'a', 'b'], 
'C': ['e', 'e', 'e', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'e', 'e'],
'B': ['c', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'c', 'c', 'd'],
'D': ['g', 'g', 'h', 'h', 'g', 'g', 'h', 'h', 'g', 'g', 'h', 'h', 'g'],
'V1': [84.0, 440.0, 423.0, 63.0, 990.0, 192.0, 169.0, 387.0, 934.0, 208.0, 834.0, 923.0, 230.0],
'V2': [120.0, 942.0, 153.0, 284.0, 517.0, 695.0, 37.0, 30.0, 237.0, 56.0, 15.0, 696.0, 25.0]}

我从这个字典创建了一个名为 df1 的 DataFrame对象。

我要最终显示:

B   C   V1  V2  V2 as Percent of B
c e 1870 1911 0.700770077
c f 1887 816 0.299229923
d e 230 25 0.023148148
d f 1890 1055 0.976851852

我可以通过执行 pivot_table(df1,values=['V1','V2'],rows=['B','C'],aggfunc=numpy.sum,fill_value= 0):

       V1    V2
B C
c e 1870 1911
f 1887 816
d e 230 25
f 1890 1055

有人知道如何执行最后一步以获得该列吗?

谢谢!乔恩

最佳答案

这是使用 groupby 到 DataFrame B 级别的一种方法:

In [11]: p
Out[11]:
V1 V2
B C
c e 1870 1911
f 1887 816
d e 230 25
f 1890 1055

In [12]: g = p.groupby(level='B')

并取每组中每个 V2 的百分比:

In [13]: g['V2'].apply(lambda s: s.astype(float) / s.sum())
Out[13]:
B C
c e 0.700770
f 0.299230
d e 0.023148
f 0.976852
dtype: float64

最后,将其分配为一列:

In [14]: p['PercentOfB'] = g['V2'].apply(lambda s: s.astype(float) / s.sum())

In [15]: p
Out[15]:
V1 V2 PercentOfB
B C
c e 1870 1911 0.700770
f 1887 816 0.299230
d e 230 25 0.023148
f 1890 1055 0.976852

为了稍微扩展一下这里发生的事情,在应用期间对每个组调用函数(在这种情况下有两个,一个用于 B='c',一个用于 B='d'),这里是c组:

In [21]: c
Out[21]:
B C
c e 1911
f 816
Name: c, dtype: int64

感兴趣的结果是除以总数:

In [22]: c.sum()
Out[22]: 2727

不幸的是,在 python 2 中,整数除法不是“正确的”:

In [23]: c / c.sum()
Out[23]:
B C
c e 0
f 0
Name: c, dtype: int64

所以我们需要通过使它们 float 来修复它,通常我使用 astype(float)* 1.0 来强制这样做:

In [24]: c.astype(float) / c.sum()
Out[24]:
B C
c e 0.70077
f 0.29923
Name: c, dtype: float64

应用然后将其与 B='d' 组一起输出以获得所需的结果。

注意:关于我是如何得到 c 的,因为我发现这是一个非常有用的写作技巧。

我创建了一个虚拟函数和一个空列表,并将其应用于 groupby:

a = []
def f(x):
a.append(x)
return x

g['v2'].apply(f)

c = a[0]

然后我开始玩这个,直到我得到我想要的。

关于python - 获取 Pandas 数据透视表中另一列的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18746721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com