【问题标题】:Pandas sum every value over certain month range every year熊猫每年对特定月份范围内的每个值求和
【发布时间】:2020-03-08 01:11:11
【问题描述】:

我想汇总每年 1 月到 6 月的数据。我有一个如下所示的数据框:

Date       Value
1980-01-01 2
1980-02-01 3
1980-03-01 3
1980-04-01 2
1980-05-01 3
1980-06-01 3

然后我希望有一个新列,该列将数据的值存储为 Sum,每年每 6 个月间隔一次,这样对于本示例,总和将 = 16。我尝试使用df.groupby()df.sum() 的组合,但无法完全弄清楚。

预期的输出如下所示:

Date       Value   Sum
1980-01-01 2       16
1980-02-01 3
1980-03-01 3
1980-04-01 2
1980-05-01 3
1980-06-01 3

【问题讨论】:

  • 你能显示你的预期输出吗?
  • 我为预期的输出编辑了问题。
  • 您的数据中有不同的月份/年份?
  • 类似df.loc[df["Date"].dt.month.le(6)].groupby(df["Date"].dt.year)["Value"].transform('sum') ?
  • How would I change it so... - 使用 isin 而不是 le 并指定整数序列。

标签: python pandas dataframe


【解决方案1】:
idx = pd.Series(pd.date_range('1/1/2018', periods=100, freq='MS'),name='date')
df = pd.DataFrame(range(len(idx)), index=idx,columns=['A'])

过滤然后resample

>>> sums = df.loc[df.index.month.isin([1,2,3,4,5,6])].resample('YS').sum()
>>> sums['A'].values
array([ 15,  87, 159, 231, 303, 375, 447, 519, 390], dtype=int64)
>>> sums
              A
date           
2018-01-01   15
2019-01-01   87
2020-01-01  159
2021-01-01  231
2022-01-01  303
2023-01-01  375
2024-01-01  447
2025-01-01  519
2026-01-01  390
>>> 

我假设 date 是您示例中的索引。如果是列更改,则需要在过滤器中使用dt accessor,并在resample 中指定列名。

dfa = pd.DataFrame({'date':idx,'A':range(len(idx))})
>>> sums = dfa.loc[dfa.date.dt.month.isin([1,2,3,4,5,6])].resample('YS',on='date').sum()
>>> sums['A'].values
array([ 15,  87, 159, 231, 303, 375, 447, 519, 390], dtype=int64)

您还可以以六个月的频率重新采样/汇总,然后只获取其他所有结果 - 即使系列中缺少几个月,它似乎也可以工作。

>>> dfq = dfa.loc[::2]
>>> dfq.head()
        date  A
0 2018-01-01  0
2 2018-03-01  2
4 2018-05-01  4
6 2018-07-01  6
8 2018-09-01  8
>>> dfc = dfq.resample('6MS', on='date').sum()
>>> dfc.loc[::2].head()
              A
date           
2018-01-01    6
2019-01-01   42
2020-01-01   78
2021-01-01  114
2022-01-01  150

如果 DataFrame 仅包含每年的前六个月,则无需过滤。只需重新采样。

>>> dfb = dfa.loc[dfa.date.dt.month.isin([1,2,3,4,5,6])]
>>> dfb.resample('YS',on='date').sum().head()
              A
date           
2018-01-01   15
2019-01-01   87
2020-01-01  159
2021-01-01  231
2022-01-01  303
>>> 

【讨论】:

  • 我收到此错误:“Int64Index”对象没有属性“月”
  • 如果有任何不同,我将数据框编辑为仅包含每年前 6 个月的数据。所以 1980 年 1 月至 6 月,然后是 1981 年 1 月至 6 月,等等。然后我将如何每 6 个月对数据求和,但不使其成为所有年份的累积总和?
  • @EliTurasky - 欢迎来到 SO。这不是讨论论坛或教程。请使用tour 并花时间阅读How to Ask 以及该页面上的其他链接。请不要不断地变形问题。
  • 很公平。谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2022-07-06
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多