Python 如果OP能够接受这种数据表示,我认为这是最好的选择(+1)。不过,我会做一些不同的事情:df.pivot\u表(index='prod',columns='week',values=['baskets','sales'],aggfunc='sum',fil

Python 如果OP能够接受这种数据表示,我认为这是最好的选择(+1)。不过,我会做一些不同的事情:df.pivot\u表(index='prod',columns='week',values=['baskets','sales'],aggfunc='sum',fil,python,python-3.x,pandas,Python,Python 3.x,Pandas,如果OP能够接受这种数据表示,我认为这是最好的选择(+1)。不过,我会做一些不同的事情:df.pivot\u表(index='prod',columns='week',values=['baskets','sales'],aggfunc='sum',fill\u value=0)就是这样:)。谢谢乔,很明显,马克斯修改的东西太棒了。这是数据帧吗?我如何重新命名这些列的名称,因为我想创建一周内每次访问的平均销售额。即(201612年销售额/201612年访问量)。简言之,添加另一列“平均支出/每篮


如果OP能够接受这种数据表示,我认为这是最好的选择(+1)。不过,我会做一些不同的事情:
df.pivot\u表(index='prod',columns='week',values=['baskets','sales'],aggfunc='sum',fill\u value=0)
就是这样:)。谢谢乔,很明显,马克斯修改的东西太棒了。这是数据帧吗?我如何重新命名这些列的名称,因为我想创建一周内每次访问的平均销售额。即(201612年销售额/201612年访问量)。简言之,添加另一列“平均支出/每篮子”_week@MaxU谢谢你的+1。是的,我喜欢你的
pivot\u表
。我很感激。你的答案也是+1。@Mukul是的,我也喜欢MaxU对
pivot\u表的修改。是的,有一种方法可以添加其他列并创建新的数据帧。由于您已经接受了其中一个答案,您可能希望在一个新问题中解决新专栏问题,因为这会给当前问题增加很多内容,并且有点混乱。+1谢谢MaxU。这就是我要找的。显然,我将不得不选择第201520周的专栏。对于每次销售和访问。需要重置索引。因为下一步是在同一个数据库中创建和平均每次访问的销售额列dataframe@Mukul,我添加了一些用于展平多级列的代码。PS别忘了接受/支持JoeR的回答,因为他是第一个提出
pivot\u表的人。谢谢很多我想现在我无法重新设置索引并为每个产品创建新的“每次访问的销售额”列。i、 e如果篮数>0,我可以计算销售额\u 201520/访问量\u 201520。请帮我添加此栏“每次访问的花费”201520。(此栏将为0 is basket is=0)。已经在投票中胜出了answer@Mukul,您是否可以扩展您的问题(或者更好地创建一个新问题),以便我们可以查看源数据集,包括
访问
列和发布所需/预期的数据集?实际上,访问与篮框相同。编辑了这个问题。蒂亚:谢谢你,马苏。这就是我要找的。显然,我将不得不选择第201520周的专栏。对于每次销售和访问。需要重置索引。因为下一步是在同一个数据库中创建和平均每次访问的销售额列dataframe@Mukul,我添加了一些用于展平多级列的代码。PS别忘了接受/支持JoeR的回答,因为他是第一个提出
pivot\u表的人。谢谢很多我想现在我无法重新设置索引并为每个产品创建新的“每次访问的销售额”列。i、 e如果篮数>0,我可以计算销售额\u 201520/访问量\u 201520。请帮我添加此栏“每次访问的花费”201520。(此栏将为0 is basket is=0)。已经在投票中胜出了answer@Mukul,您是否可以扩展您的问题(或者更好地创建一个新问题),以便我们可以查看源数据集,包括
访问
列和发布所需/预期的数据集?实际上,访问与篮框相同。编辑了这个问题。TIA:)
prod store week    baskets sales
123  112   201518  20      100.45
123  112   201519  21      89.65
123  112   201520  22      1890.54
122  112   201518  10      909.99
prod total_baskets   total_sales  spend_per_basket
123  22              1890.54      85.93363636
122  0               0            0
trans_for_my_week=weekly_trans[weekly_trans['week']==201520]    
avg_sales=pd.DataFrame(trans_for_my_week.groupby(['prod']).agg({'baskets':      {'total_baskets':'sum'},
                                                 'sales' :{'total_sales':'sum'}}))
avg_sales_period_0.columns=avg_sales_period_0.columns.droplevel(0)
avg_sales_period_0=avg_sales_period_0.reset_index()
x=round(res.sales / res.baskets,4)
x.columns = pd.MultiIndex.from_product(['spend_per_basket', res.columns.get_level_values(1).drop_duplicates()])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-fbb15ec86cc6> in <module>()
      7 
      8 x=round(res.sales / res.baskets,4)
----> 9 x.columns = pd.MultiIndex.from_product(['spend_per_basket', res.columns.get_level_values(1).drop_duplicates()])
     10 print(x)

/usr/lib64/python3.4/site-packages/pandas/indexes/multi.py in from_product(cls, iterables, sortorder, names)
   1022         from pandas.tools.util import cartesian_product
   1023 
-> 1024         labels, levels = _factorize_from_iterables(iterables)
   1025         labels = cartesian_product(labels)
   1026 

/usr/lib64/python3.4/site-packages/pandas/core/categorical.py in _factorize_from_iterables(iterables)
   2066         # For consistency, it should return a list of 2 lists.
   2067         return [[], []]
-> 2068     return map(list, lzip(*[_factorize_from_iterable(it) for it in iterables]))

/usr/lib64/python3.4/site-packages/pandas/core/categorical.py in <listcomp>(.0)
   2066         # For consistency, it should return a list of 2 lists.
   2067         return [[], []]
-> 2068     return map(list, lzip(*[_factorize_from_iterable(it) for it in iterables]))

/usr/lib64/python3.4/site-packages/pandas/core/categorical.py in _factorize_from_iterable(values)
   2028 
   2029     if not is_list_like(values):
-> 2030         raise TypeError("Input must be list-like")
   2031 
   2032     if is_categorical(values):

TypeError: Input must be list-like
In [8]: x = res.sales / res.baskets

In [9]: x
Out[9]:
week   201518    201519     201520
prod
122   90.9990       NaN        NaN
123    5.0225  4.269048  85.933636

In [10]: x.columns = pd.MultiIndex.from_product([['spend_per_basket'], res.columns.get_level_values(1).drop_duplicates()])

In [11]: x
Out[11]:
     spend_per_basket
               201518    201519     201520
prod
122           90.9990       NaN        NaN
123            5.0225  4.269048  85.933636

In [12]: res = res.join(x)

In [13]: res
Out[13]:
     baskets                 sales                 spend_per_basket
week  201518 201519 201520  201518 201519   201520           201518    201519     201520
prod
122       10      0      0  909.99   0.00     0.00          90.9990       NaN        NaN
123       20     21     22  100.45  89.65  1890.54           5.0225  4.269048  85.933636
res = df.pivot_table(index='prod', columns='week', values=['baskets','sales'], aggfunc='sum', fill_value=0)

In [189]: res
Out[189]:
     baskets                 sales
week  201518 201519 201520  201518 201519   201520
prod
122       10      0      0  909.99   0.00     0.00
123       20     21     22  100.45  89.65  1890.54

In [190]: res[[('baskets',201519)]]
Out[190]:
     baskets
week  201519
prod
122        0
123       21

In [192]: res.ix[122, [('sales',201519)]]
Out[192]:
       week
sales  201519    0.0
Name: 122, dtype: float64
In [194]: res2 = res.copy()

In [196]: res2.columns = ['{0[0]}_{0[1]}'.format(col) for col in res2.columns]

In [197]: res2
Out[197]:
      baskets_201518  baskets_201519  baskets_201520  sales_201518  sales_201519  sales_201520
prod
122               10               0               0        909.99          0.00          0.00
123               20              21              22        100.45         89.65       1890.54
from itertools import product

In [165]: %paste
g = df.groupby(['week', 'prod']).agg({'baskets':'sum', 'sales':'sum'}).reset_index()
al = pd.DataFrame(list(product(df['prod'].unique(), df.week.unique())), columns=['prod','week'])

res = pd.merge(al, g, on=['prod','week'], how='left').fillna(0)
## -- End pasted text --

In [166]: res
Out[166]:
   prod    week    sales  baskets
0   123  201518   100.45     20.0
1   123  201519    89.65     21.0
2   123  201520  1890.54     22.0
3   122  201518   909.99     10.0
4   122  201519     0.00      0.0
5   122  201520     0.00      0.0
# First create a container DataFrame to hold the data:
columns = pd.MultiIndex.from_arrays([['a', 'b'], df[0].unique()])
output = pd.DataFrame(columns=columns)

# Then the groupby magic
agg_sales = weekly_trans.groupby(['week','prod']).agg({'baskets' : {'total_baskets':'sum'},
                                                       'sales'   : {'total_sales'  :'sum'}})
agg_sales = agg_sales.unstack() # This will set your 'prod' as columns
output = pd.concat([output, agg_sales], axis=0)

# And you can do that in one line, if you need to:
output = pd.concat([output, weekly_trans.groupby(['week','prod']).\
                       agg({'baskets' : {'total_baskets':'sum'},
                            'sales'   : {'total_sales'  :'sum'}}).\
                           unstack()], axis=0)
print(pd.pivot_table(df, index = 'week', columns = 'prod', values = 'sales', aggfunc = 'sum').fillna(0))
prod       122      123
week                   
201518  909.99   100.45
201519    0.00    89.65
201520    0.00  1890.54