首页 > 解决方案 > 遍历 pandas df 行并执行操作

问题描述

我有一个熊猫数据框,如下所示

    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

标签: pythonpandasfor-loopdataframegroup-by

解决方案


我认为你自己把这件事弄得太复杂了。您几乎已经解决了自己的问题,但我建议您在最初的and之后进行索引。groupbyagg

示例数据框

    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 

groupbyagg

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

推荐阅读