【问题标题】:Getting percentage of another Column in Pandas Pivot Table获取熊猫数据透视表中另一列的百分比
【发布时间】:2013-09-11 16:37:05
【问题描述】:

我正在尝试在 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 的 DataFrameobject。

我想最终显示:

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)从 Pandas pivot_table 获取:

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

有人知道如何做最后一步来获得专栏吗?

谢谢! 乔恩

【问题讨论】:

    标签: python pandas pivot-table


    【解决方案1】:

    这是使用 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
    

    所以我们需要通过让它们浮动来修复它,通常我使用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]
    

    然后我一直在玩,直到得到我想要的。

    【讨论】:

    • 您能帮我详细介绍一下,以便我更好地理解它吗? groupby 是如何让 lambda 函数工作的?
    • @Jon 扩展了很多,希望它不那么神奇...... :)
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多