Pandas,按特定月份分组并求和

3

I have a DataFrame :

<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]?

谢谢。


我认为你可以将一个季节字典映射到你的数据上,然后根据它进行分组。 - Woody Pride
1个回答

4

是的,我认为一个看起来很不错的解决方案是使用Seasons字典,然后使用函数对数据进行分组。任何作为组键传递的函数都将每个索引值调用一次,并将返回值用作组名称。

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()

该函数获取每个索引值并在Seasons字典中查找月份,返回对应于月份键的值。然后该值成为分组名称。
另外,您可以像您的示例中那样使用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),但是我该如何选择只有冬季数据以继续进一步分析呢? - Stavros Anastasiadis
我正在尝试以动态方式选择数据。例如,不同的数据图表,如Winter.Sum per Year和Data.Summer.Sum per Year,将为我提供有用的数据集信息。 - Stavros Anastasiadis
对我来说,最好创建一个Season变量,然后根据它来切片数据。我不确定你是否需要groupby操作。我现在会更新答案...如果您喜欢这个答案,请投票支持。谢谢 - Woody Pride
你的更新答案是我正在寻找的。这是一个相当不错的季节性分析解决方案。谢谢。 - Stavros Anastasiadis
好的,知道了。是的,抱歉我用“efficient”这个词形容手指动作的方式可能有些不太恰当。 - Woody Pride
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接