【问题标题】:Iterating through the pandas df rows and do an operation遍历 pandas df 行并执行操作
【发布时间】:2018-05-17 14:08:50
【问题描述】:

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

    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

【问题讨论】:

  • 你能发布df1应该是什么样子吗?该代码不适合我。
  • 当然,我会编辑我的问题
  • 我想我得到了您想要做的事情,但是我认为您的示例数据中的任何示例都不会被汇总,因为您在 SKU 中没有任何重叠条目柱子。理想的输出在这里会很有帮助。
  • sorry chrisz,我只给出了几个 SKU,还有很多但我无法全部显示。实际上每天都有多个 SKU
  • inventory_1stOct = inventory.query("ActivityDate == \"2017-10-01\"")

标签: python pandas for-loop dataframe group-by


【解决方案1】:

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

示例数据帧

    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

【讨论】:

  • 哦,是的,我们能不能只写几行代码来自动化 2017 年的所有日子。如果我写这个,我必须写 365 + 1 行代码
  • 谢谢你,克里斯,非常感谢你的帮助
  • @AhamedMoosa 更新了我的答案,您只需更改您的 date_range 以包括 2017 年的所有日子(并且可能存储在列表中,而不是打印)
  • 哇,太酷了。我正在从 R 转移到 python ,因此我可能会问一些幼稚的问题,你能告诉我如何将它们存储为数据帧而不是打印
  • 只需将它们附加到列表或类似的东西。如果您正在谈论如何将它们存储到某种文件中,那么 SO 上有很多答案可以解决这个问题。
【解决方案2】:

如果你先做

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

【讨论】:

  • 嗨,本,感谢您的回答。但是我无法实现它。我已经编辑了我的问题,请您检查是否可以提供帮助。谢谢。
  • @AhamedMoosa 你现在找到了答案,真为你高兴 :)
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 2014-10-28
  • 1970-01-01
  • 2017-08-21
相关资源
最近更新 更多