【问题标题】:Pandas_Pivot table - making additional columns from division of merged columnsPandas_Pivot 表 - 从合并列的划分中创建附加列
【发布时间】:2017-08-11 10:05:19
【问题描述】:

我正在尝试运行以下函数

def make_europe_view(data):

    data['% Rev'] = data.GrossRevenue_GBP/data.GrossRevenue_GBP.sum()

    tmean = lambda x :stats.trim_mean(x, 0.1)

    pivot = pd.pivot_table(data[(data['New_category_ID'] != 0)&(data['YYYY'] == 2016)], 
                                index = 'New_category',  
                                values=['GrossRevenue_GBP','MOVC_GBP','PM_GBP', '% Rev'],
                                aggfunc= {'MOVC_GBP':tmean,'PM_GBP':tmean,'GrossRevenue_GBP':[np.sum,tmean],'% Rev':np.sum })



    pivot['% PM'] = pivot['PM_GBP']/pivot[('GrossRevenue_GBP')]['<lambda>']
    #pivot['% MOVC'] = pivot['MOVC_GBP']/Tmean_GR
    pivot['Country'] = 'EU'
    pivot['product_cat'] = pivot.index

    #pivot = pivot[['product_cat', '% Rev', 'GrossRevenue_GBP', 'MOVC_GBP', 'PM_GBP', '% PM', '% MOVC', 'Country']]

    return pivot

我想通过截断的平均值和总和来汇总总收入,生成数据透视表没有问题,但是在创建一些额外的列时遇到了问题。具体这部分代码:

 pivot['% PM'] = pivot['PM_GBP']/pivot[('GrossRevenue_GBP')]['<lambda>']

我正在尝试创建一个列,通过将“PM_GBP”列的截断平均值作为“GrossRevenue_GBP”列的截断平均值的百分比来计算 PM 的截断平均值百分比

它会产生以下错误:

ValueError: Wrong number of items passed 25, placement implies 1

非常感谢您对此的帮助。

当我运行 list() 时,pivot 的列名:

[('GrossRevenue_GBP', '<lambda>'),  ('GrossRevenue_GBP', 'sum'),  ('% Rev', 'sum'),  ('MOVC_GBP', '<lambda>'),  ('PM_GBP', '<lambda>'),  ('Country', ''),  ('product_cat', '')]

【问题讨论】:

  • pd.pivot_table(...) 之后的样本数据 (pivot) 是什么?
  • @jezrael - 我已经在上面添加了,当写入到 excel 文件中以进行枢轴输出时输出
  • (数字已被清理)
  • 对不起,我有时间回答了。请检查一下。

标签: python pandas pivot pivot-table subset


【解决方案1】:

您可以将元组用于列中MultiIndex 中的选择值:

tups = [('GrossRevenue_GBP', '<lambda>'),  ('GrossRevenue_GBP', 'sum'),  ('% Rev', 'sum'),  ('MOVC_GBP', '<lambda>'),  ('PM_GBP', '<lambda>'),  ('Country', ''),  ('product_cat', '')]
idx = list('ab')
cols = pd.MultiIndex.from_tuples(tups)
pivot = pd.DataFrame([[7,4,5,8,4,5,1],
                   [1,5,7,3,9,6,7]], columns=cols, index=idx)
print (pivot)
  GrossRevenue_GBP     % Rev MOVC_GBP   PM_GBP Country product_cat
          <lambda> sum   sum <lambda> <lambda>                    
a                7   4     5        8        4       5           1
b                1   5     7        3        9       6           7

pivot['% PM'] = pivot[('PM_GBP','<lambda>')]/pivot[('GrossRevenue_GBP','<lambda>')]
print (pivot)
  GrossRevenue_GBP     % Rev MOVC_GBP   PM_GBP Country product_cat      % PM
          <lambda> sum   sum <lambda> <lambda>                              
a                7   4     5        8        4       5           1  0.571429
b                1   5     7        3        9       6           7  9.000000

为了更简单的生活可以删除MultiIndex并创建列:

#rename columns by dict
pivot = pivot.rename(columns={'<lambda>':'tmean'})
#remove multiindex
pivot.columns = pivot.columns.map('_'.join).str.strip('_')

#simply divide
pivot['% PM'] = pivot['PM_GBP_tmean']/pivot['GrossRevenue_GBP_tmean']
print (pivot)
   GrossRevenue_GBP_tmean  GrossRevenue_GBP_sum  % Rev_sum  MOVC_GBP_tmean  \
a                       7                     4          5               8   
b                       1                     5          7               3   

   PM_GBP_tmean  Country  product_cat      % PM  
a             4        5            1  0.571429  
b             9        6            7  9.000000  

【讨论】:

  • 这是一种更优雅的方式,非常感谢您的帮助!
  • 很高兴能帮上忙!周末愉快!
  • 奇怪.. 运行代码时出现以下错误:AttributeError: 'numpy.ndarray' object has no attribute 'str'
  • 我已经解决了这个问题 - 我必须在 map 之前移动一段代码,这已经解决了它。感谢您的耐心等待
  • 没问题,我知道而且我在线我尝试评论回复
猜你喜欢
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多