我有一个pandas数据框,如下所示
Date SKU Balance
0 1/1/2017 X1 8
1 1/1/2017 X2 45
2 1/1/2017 X1 47
3 1/1/2017 X2 16
4 2/1/2017 X1 14
5 2/1/2017 X2 67
6 2/1/2017 X2 9
8 2/1/2017 X1 66
9 2/1/2017 X1 158
我的第一个目标是生成每天过滤的多个数据框
我编码的
df_1stjan = df.query("Date == \"1/1/2017\"")
我得到了以下结果
Date SKU Balance
0 1/1/2017 X1 8
1 1/1/2017 X2 45
2 1/1/2017 X1 47
3 1/1/2017 X2 16
我的第二个目标是按照SKU的分组进行编码
df_1stjan_uSKU = df_1stjan.groupby(['SKU','Date'], \
as_index=False).agg({'Balance':'sum'})
我得到了以下结果
Date SKU Balance
0 1/1/2017 X1 55
1 1/1/2017 X2 61
目前我只能编码为一个日期生成一个日期的df
但我需要编写一个函数或循环来自动化它2017年的所有日子。
注意Date列有字符串dtype
答案 0 :(得分:2)
我认为你这让自己太复杂了。您已经解决了自己的问题,但我建议您在初始 groupby
和 agg
>
示例数据框 :
Balance Date SKU
0 8 1/1/2017 X1
1 45 1/1/2017 X2
2 47 1/1/2017 X1
3 16 1/1/2017 X2
4 22 1/2/2017 X3
5 24 1/2/2017 X3
6 25 1/3/2017 X4
7 3 1/3/2017 X4
使用 groupby
agg
df1 = df.groupby(['Date', 'SKU'], as_index=False).agg({'Balance':'sum'})
Date SKU Balance
0 1/1/2017 X1 55
1 1/1/2017 X2 61
2 1/2/2017 X3 46
3 1/3/2017 X4 28
to_datetime
转换Date
列
df1['Date'] = pd.to_datetime(df1.Date, format='%m/%d/%Y')
date_range
,您想要访问的所有日期
dr = pd.date_range('20170101','20170103')
loc
,每天都有循环访问切片
for d in dr:
print(df1.loc[df1.Date.isin([d])])
Date SKU Balance
0 2017-01-01 X1 55
1 2017-01-01 X2 61
Date SKU Balance
2 2017-01-02 X3 46
Date SKU Balance
3 2017-01-03 X4 28
答案 1 :(得分:0)
如果你先做
df_group = df.groupby(['Date', 'C1', 'C2', 'C3', 'SKU']).sum()
然后你可以创建你的dfs,如:
for date in set(df['Date']):
df_date = df_group.loc[date].reset_index()
# and do whatever with df_date, you can save them in a list for example
# to access them later but maybe the df_group.loc[date].reset_index() is enough for what you need