问题描述
Date |value | month | year |
2013-01-03 | 13 | 01 | 2013 |
2013-01-06 | 14 | 01 | 2013 |
2014-01-03 | 16 | 01 | 2014 |
2011-01-03 | 15 | 01 | 2011 |
应该给出类似的内容:
Date |value | month | year | max |
2013-01-03 | 13 | 01 | 2013 | 14 |
2013-01-06 | 14 | 01 | 2013 | 14 |
2014-01-03 | 16 | 01 | 2014 | 16 |
2011-01-03 | 15 | 01 | 2011 | 15 |
解决方法
使用pd.Grouper
按月份和transform
分组:
df["Date"] = pd.to_datetime(df["Date"])
df["max"] = df.groupby(pd.Grouper(key="Date",freq="M"))["value"].transform("max")
# or df.groupby(df["Date"].str[:8])["value"].transform("max")
print (df)
Date value month year max
0 2013-01-03 13 1 2013 14
1 2013-01-06 14 1 2013 14
2 2014-01-03 16 1 2014 16
3 2011-01-03 15 1 2011 15
,
尝试
df['max'] = df.apply(lambda r: df[(df.month==r['month']) & (df.year==r['year'])]['value'].max(),axis=1)
,
我认为 Date 列是 datetime 类型。
使用:
df['Max'] = df.groupby(pd.Grouper(key='Date',freq='M')).value.transform(max)
我故意将列名称更改为 Max (以大写 M 开头) 为了不“覆盖”现有的 Pandas 功能。