我的数据看起来像
color | date | sales
green | 2018-04-19 | 6
red | 2018-12-01 | 3
blue | 2018-09-14 | 7
. | . | .
. | . | .
所有日期都在2018年1月1日至2019年1月1日之间,并且颜色列中有许多颜色重复多次。例如,红色可能出现在各个日期,绿色可能出现在相同的日期。有数千条记录和与此查询无关的其他几列。
我将其放在数据框中,并按date
列升序排序并重置索引。但是,我想做的是每周创建一列,其中每一行都是唯一的颜色,以及该周内该颜色的销售额之和。
我认为类似df_sales['date'].resample('W').sum()
之类的东西然后旋转数据可能会解决问题,但这是行不通的。我知道为了使用resample
,我需要通过date
将索引设置为df_sales.set_index(pd.DatetimeIndex(df_sales['date']), inplace=True)
列。但是运行print(df_shoes['date'].resample('W'))
只会给我DatetimeIndexResampler [freq=<Week: weekday=6>, axis=0, closed=right, label=right, convention=start, base=0]
,对我没有太大帮助。
它根本不允许我使用sum()
函数。
理想情况下,我的结果看起来像(或类似情况,每列为一周):
color | 2018-01-01 | 2018-01-08 | ... | 2018-12-24
green | 14 | 0 | ... | 6
indigo | 9 | 3 | ... | 18
任何可以帮助我实现这一目标的方法都很棒!
谢谢
答案 0 :(得分:1)
让我们再尝试一次。
将列日期转换为时间戳记
df['date']=pd.to_datetime(df['date']).dt.date
然后 找到一周的开始位置
df['BeginWeek']=df['date']-pd.DateOffset(weekday=0,weeks=1)
然后遍历结果
df_pivot=df.pivot_table(index='color',columns='BeginWeek',values='sales',aggfunc='sum').fillna(0)
答案 1 :(得分:1)
好的,现在我理解了您的问题,您可以尝试:
# toy data frame
np.random.seed(2019)
dates = pd.date_range('2018-01-01', '2018-1-21', freq='D')
colors = np.random.randint(0,3, len(dates))
values = np.random.normal(10,20, len(dates))
df = pd.DataFrame({'dates': dates,
'colors': colors,
'values': values})
df.groupby('colors').resample(rule='W', on='dates').values.sum().reset_index()
输出:
+---+--------+------------+------------+
| | colors | dates | values |
+---+--------+------------+------------+
| 0 | 0 | 2018-01-07 | 103.963813 |
| 1 | 0 | 2018-01-14 | 52.569041 |
| 2 | 0 | 2018-01-21 | 67.987307 |
| 3 | 1 | 2018-01-07 | 2.940078 |
| 4 | 1 | 2018-01-14 | -18.655026 |
| 5 | 1 | 2018-01-21 | -7.875686 |
| 6 | 2 | 2018-01-07 | 21.254167 |
| 7 | 2 | 2018-01-14 | 8.990712 |
| 8 | 2 | 2018-01-21 | -4.180851 |
+---+--------+------------+------------+