Pandas数据透视表作用于透视数据框

时间:2017-07-20 17:25:09

标签: python pandas pivot pivot-table

我有一个已经旋转的数据框,看起来像下面这样。

var regex1 = /&myparameter\[(.*?)\]=/g;
var regex2 = /\]=(.*?)\&/g;
var input = '&myparameter[123]=1&myparameter[678]=4&otherthings=rtz';
var match;
var y = [];
do {
  match = regex1.exec(input);
  match2 = regex2.exec(input);
  if (match) {
    var x = match[1];
    var c = match2[1];
    var y = ';' + x + ';' + c;
    console.log(y);
  }
} while (match);

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

我想要做的是汇总数字并将它们置于货币之下。所需的输出是(我已经未加评估,因此很清楚它的来源)

.icon-button {
  position: relative;
}

.icon-button button {
  position: absolute;
  top: 0; left: 0;
}

我试过了

             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

Pandas根本不喜欢给出KeyError。

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

             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  

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

编辑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)