【问题标题】:Pandas pivot table acting on a pivoted dataframe作用于旋转数据框的 Pandas 数据透视表
【发布时间】:2017-07-20 17:25:09
【问题描述】:

我有一个已经旋转的数据框,如下所示。

             Cost      Transport     Currency        
Manufacturer  ABC  XYZ       ABC XYZ      ABC     XYZ
Date                                                 
2017-07-01    312  323        31  41   Pounds  Pounds
2017-07-02    423  335        21  32  Dollars  Pounds
2017-07-03    421  304        21  21  Dollars  Pounds

上面显示了与从制造商处购买物品相关的成本和运输费用,以及成本和费用以何种货币计价。

我要做的是汇总数字并将它们放在货币下。所需的输出是(我没有对加法进行评估,以便清楚它来自哪里)

             Currency        
             Dollars     Pounds
Date                                                 
2017-07-01     0        312+323+31+41   
2017-07-02    423+21       335+32  
2017-07-03    421+21       304+21  

我试过了

df.pivot_table(index='Date', columns='Currency', aggfunc=np.sum)

Pandas 根本不喜欢哪个给出 KeyError。

这是获取起始数据帧 df 的代码。在实际用例中,数据绝对需要先进行数据透视才能进行分析和聚合,因此请不要在 my_list 或 df_raw 上应用数据透视表。

my_list = ["2017-07-01", "ABC",312, 31, "Pounds",  "2017-07-01", "XYZ" ,323, 41, "Pounds",
           "2017-07-02", "ABC", 423, 21, "Dollars", "2017-07-02", "XYZ" ,335, 32, "Pounds",
           "2017-07-03", "ABC", 421, 21, "Dollars", "2017-07-03", "XYZ", 304, 21, "Pounds" ]
df_raw = pd.DataFrame(np.array(my_list).reshape(6,5),
                   columns = ["Date", "Manufacturer", "Cost", "Transport", "Currency"])
df = df_raw.pivot(index='Date', columns='Manufacturer')

【问题讨论】:

    标签: python pandas pivot pivot-table


    【解决方案1】:

    使用stackgroupbysumunstack

    使用您的设置和输入数据框:

    my_list = ["2017-07-01", "ABC",312, 31, "Pounds",  "2017-07-01", "XYZ" ,323, 41, "Pounds",
               "2017-07-02", "ABC", 423, 21, "Dollars", "2017-07-02", "XYZ" ,335, 32, "Pounds",
               "2017-07-03", "ABC", 421, 21, "Dollars", "2017-07-03", "XYZ", 304, 21, "Pounds" ]
    df_raw = pd.DataFrame(np.array(my_list).reshape(6,5),
                       columns = ["Date", "Manufacturer", "Cost", "Transport", "Currency"])
    df = df_raw.pivot(index='Date', columns='Manufacturer')
    
    df = df.apply(pd.to_numeric,errors='ignore')
    

    重塑数据框并计算:

    df.stack().groupby(['Date','Currency']).sum().sum(1).unstack(fill_value=0)
    

    输出:

    Currency    Dollars  Pounds
    Date                       
    2017-07-01        0     707
    2017-07-02      444     367
    2017-07-03      442     325
    

    【讨论】:

    • 谢谢。 stack、groupby、sum 和 unstack 的使用令人印象深刻。 :-)
    【解决方案2】:

    编辑 2:修订

    df2 = df.stack()
    df2['total'] = df2['Cost'] + df2['Transport'] 
    df2.reset_index(inplace = True)
    df2.pivot_table(index = 'Date', columns = 'Currency', values = 'total', aggfunc = np.sum, fill_value = 0)
    

    编辑:以下答案对于您正在寻找的内容实际上是不可接受的。将尝试修改...

    一种方式...

    df_raw['total_cost'] = df_raw['Cost'] + df_raw['Transport']
    df_raw.pivot_table(index = 'Date', columns = 'Currency', values = ['total_cost'], aggfunc = 'sum', fill_value = 0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 2017-09-01
      • 2022-12-04
      • 2020-05-21
      • 1970-01-01
      • 2019-01-03
      • 2018-10-28
      • 2018-01-31
      相关资源
      最近更新 更多