pandas datafram中按特定月份分组和求和值

2024-10-03 11:15:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧df,它看起来像这样,其中没有设置索引:

df.head()

    year    month   inch    mm
0   1981    2       0.00    0.000
1   1981    3       4.82    122.428
2   1981    4       6.45    163.830
3   1981    5       5.03    127.762
4   1981    6       1.25    31.750

(1)首先,我只想选择1987年到2017年之间的年份。在

(2)然后我想按年份对选择的月份进行分组:MAM(so3-5)、JJAS(6-9)和OND(10-12),并将这些月份的mm列相加。在

结果可能是这样的:

^{pr2}$

我不确定如何完成第1部分,但我知道对于第2部分,我需要将month列转换为日期时间对象。在

然后我将通过以下方式定义兴趣月份:

MAM = df.iloc[df.index.month.isin(np.r_[3:6])]
JJAS = df.iloc[df.index.month.isin(np.r_[6:10])]
OND = df.iloc[df.index.month.isin(np.r_[10:13])]

但现在我得到了一个错误AttributeError: 'RangeIndex' object has no attribute 'month'。在

提前谢谢!在


Tags: 数据dfindexnpyearheadmm年份
2条回答

这里有一个稍微不同的方法:使用yearmonth来构建索引,然后使用一个UDF groupby()。在

示例数据:

N = 10
years = pd.date_range("1981", "2017", freq="A").year
dates = np.random.choice(years, size=N, replace=True)
months = np.random.choice(range(1,13), size=N, replace=True)
inches = np.random.randint(1,20, size=N)
mm = np.random.randint(1,100, size=N)
data = {"year":dates, "month":months, "inch":inches, "mm":mm}
df = pd.DataFrame(data)

df
   inch  mm  month  year
0    19  31     12  1990
1     8  71      9  1986
2     5  85      2  2009
3    17   8     12  2005
4    10  14     12  1987
5     7  87      2  1982
6     8  59      2  2004
7     8  74      8  2016
8     5   6      6  1993
9     3   7     12  1982

现在根据年份进行子集并构建索引:

^{pr2}$

然后使用year和月份分隔函数groupby:

def month_gb(x):
    if x.month in range(3,6):
        return 'MAM'
    elif x.month in range(6,10):
        return 'JJAS'
    elif x.month in range(10,13):
        return 'OND'

df.loc[mask].groupby(["year", month_gb]).mm.sum()

year      
1987  OND     14
1990  OND     31
1993  JJAS     6
2005  OND      8
2016  JJAS    74
Name: mm, dtype: int64

第一部分很简单。使用pd.Series.between

df = df[df.year.between(1987, 2017)]

如果year未排序,我建议先排序df,然后使用sort_values(subset='year')进行排序。在

在下一部分中,一个解决方案将涉及生成一个dict映射,然后使用map将{}转换为映射字符串,并对其进行分组。在

^{pr2}$

相关问题 更多 >