Python 熊猫每年对特定月份范围内的每个值求和
我想对每年1月到6月的数据进行汇总。我有一个如下所示的数据帧:Python 熊猫每年对特定月份范围内的每个值求和,python,pandas,dataframe,Python,Pandas,Dataframe,我想对每年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 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 然后,我希望有一个新的
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
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
然后,我希望有一个新的列,将数据值存储为每年每隔6个月的Sum
,这样在本例中,Sum将=16。我尝试使用df.groupby()
和df.sum()
的组合,但没有完全理解
预期输出如下所示:
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
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
然后过滤
我假设
date
是您示例中的索引。如果是列更改,则需要在筛选器中使用,并在重采样中指定列名
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
如果数据帧仅包含每年的前六个月,则不需要进行筛选。只需重新采样
>>> 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
>>>
然后过滤
我假设date
是您示例中的索引。如果是列更改,则需要在筛选器中使用,并在重采样中指定列名
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
如果数据帧仅包含每年的前六个月,则不需要进行筛选。只需重新采样
>>> 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
>>>
你能显示你的预期产出吗?我编辑了预期产出的问题。你的数据中有不同的月/年?类似于df.loc[df[“Date”].dt.month.le(6)].groupby(df[“Date”].dt.year)[“Value”].transform('sum'))
?我将如何更改它…
-使用isin
而不是le
,并指定一个整数序列。你能显示你的预期输出吗?我编辑了预期输出的问题。你的数据中有不同的月/年?类似于df.loc[df[“Date”].dt.month.le(6)].groupby(df[“Date”].dt.year)[“值”]。转换('sum')
?我将如何更改它…
-使用isin
而不是le
,并指定一个整数序列。我得到一个错误:“Int64Index”对象没有属性“month”,如果它有任何区别,我编辑了我的数据框,使其仅包含每年前6个月的数据。因此,1980年1月-6月,然后是1981年1月-6月,等等。然后我该如何每6个月对数据进行一次汇总,但不使其成为历年的累计汇总?@EliTurasky-欢迎光临。这不是一个讨论论坛或教程。请花点时间阅读和阅读该页面上的其他链接。请不要不断修改问题。很公平。谢谢您的回复是。我得到了这个错误:“Int64Index”对象没有属性“month”,如果它有任何区别,我编辑了我的数据框,只包含每年前6个月的数据。那么1980年1月-6月,然后是1981年1月-6月,等等。那么我如何每6个月对数据求和一次,但不使其成为所有年份的累积和?@EliTurasky-欢迎来到SO。这不是一个讨论论坛或教程。请花时间阅读和阅读该页面上的其他链接。请不要不断修改问题。足够公平。谢谢。