代码之家  ›  专栏  ›  技术社区  ›  Ahamed Moosa

遍历行并执行操作

  •  1
  • Ahamed Moosa  · 技术社区  · 7 年前

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

        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年的所有日子里实现自动化。

    注意日期列有字符串dtype

    2 回复  |  直到 6 年前
        1
  •  2
  •   user3483203    7 年前

    我觉得你把事情弄得太复杂了。您已经基本解决了自己的问题,但我建议您进行索引 之后 首字母 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 
    

    子句 具有 阿格

    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
    
        2
  •  0
  •   Ben.T    7 年前

    如果你先做

    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