【问题标题】:Pandas, groupby and summing over specific monthsPandas、groupby 和特定月份的求和
【发布时间】:2013-10-27 17:39:26
【问题描述】:

我有一个数据框:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 982 entries, 2009-10-30 00:00:00 to 2012-12-16 00:00:00
Data columns (total 4 columns):
rain        981  non-null values
temp_max    982  non-null values
temp_min    982  non-null values
temp        982  non-null values
dtypes: float64(4)

对于每年/每月的求和,我使用:

mdata = data.groupby([lambda x: x.year, lambda x: x.month]).agg([sum])

但我需要季节性分析(夏季、冬季等),那么我如何创建特定月份的总和,例如每年的 [1 ,2 ,3]?

【问题讨论】:

  • 我原以为您可以将季节字典映射到您的数据,然后根据它进行分组。

标签: python pandas sum


【解决方案1】:

是的,对我来说似乎很简洁的一种解决方案是使用季节字典,然后使用函数对数据进行分组。作为组键传递的任何函数,每个索引值都会调用一次,返回值用作组名。

import pandas as pd
import numpy as np
from pandas import DataFrame
import datetime
# Create a year's worth of data
base = datetime.date.today() - datetime.timedelta(365)
Datelist = [base + datetime.timedelta(days = x) for x in range(365)]
DF = DataFrame(np.random.rand(365), index = Datelist)

# Create a Seasonal Dictionary that will map months to seasons
SeasonDict = {11: 'Winter', 12: 'Winter', 1: 'Winter', 2: 'Spring', 3: 'Spring', 4: 'Spring', 5: 'Summer', 6: 'Summer', 7: 'Summer', \
8: 'Autumn', 9: 'Autumn', 10: 'Autumn'}

# Write a function that will be used to group the data
def GroupFunc(x):
    return SeasonDict[x.month]

# Call the function with the groupby operation. 
Grouped = DF.groupby(GroupFunc)
Grouped.sum()

该函数获取每个索引值并在季节字典中查找月份并返回与月份键对应的值。该值随后成为组名。

或者,您可以使用示例中的 lambda(效率更高,但我认为上面的内容更容易理解):

DF.groupby(lambda x: SeasonDict[x.month]).sum()

根据评论的附加代码 在我看来,您最好对数据进行切片。因此,您可以执行以下操作

DF['Season'] = ""
for row in DF.index:
    DF.Season[row] = SeasonDict[row.month]
DFWinter = DF[DF.Season == 'Winter']

现在您有了一个包含冬季数据的新数据框,可以随意使用。 不同之处在于 groupby 操作允许您对所有数据执行相同的操作,而听起来您想以不同的方式调查数据集不同部分的属性。为此,最好进行切片,在这种情况下使用布尔切片。

【讨论】:

  • Woody Pride,感谢您的回答。我正在使用DF.groupby([lamdba x:x.year, lambda x: SeasonDict[x.month]]).agg(sum),但我如何才能仅选择冬季数据继续进一步分析?
  • 是的,看起来不错。因此,您将获得按年份/季节分组的数据。但是您只需要冬季数据吗?那正确吗?如果是这样,那么您不应该按年份/季节分组。事实上,您根本不需要分组,您只需对数据进行切片即可。还是我错过了什么?您实际上是想处理所有组,还是只处理冬季数据?
  • 我试图以一种动态的方式选择数据。例如,不同的 data.Winter.Sum per Year 和 Data.Summer.Sum per Year 将为我提供数据集的有用信息。
  • 在我看来,如果您只是创建一个 Season 变量会更好,然后您可以根据它对数据进行切片。我不确定您是否需要 groupby 操作。我现在将更新答案...如果您喜欢,请为答案投票。谢谢
  • 您的更新答案是我正在寻找。这是一个非常好的季节性分析解决方案。泰
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2019-01-23
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2021-10-18
相关资源
最近更新 更多