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