Pandas groupby 值并获取最大日期和最小日期的值
Pandas groupby value and get value of max date and min date
我有一个 pandas DataFrame df
看起来像这样:
item year value
A 2010 20
A 2011 25
A 2012 32
B 2016 20
B 2019 40
B 2018 50
我的目标是能够为每个项目计算每个日期之间的价值差异。然后例如,我想找到项目 A:12(32 -20,因为最大年份是 2012 年,最小年份是 2010 年)和项目 B:20(40 - 20,因为最大年份是 2019 年,最小年份是 2016 年) .
我使用以下代码为每个项目获取最大年份和最小年份:
df.groupby("item").agg({'year':[np.min, np.max]})
然后,我找到每个项目的最小年份和最大年份。然而,我坚持做我想做的。
使用:
def fun(x):
return x[x.index.max()] - x[x.index.min()]
res = df.set_index("year").groupby("item").agg(fun)
print(res)
输出
value
item
A 12
B 20
通过 year
尝试 sort_values
,然后您可以 groupby
和 select first
min
和 last
max
:
g = df.sort_values('year').groupby('item')
out = g['value'].last() - g['value'].first()
输出:
item
A 12
B 20
Name: value, dtype: int64
在 agg 中使用 loc 访问器来计算值差,此外,您还可以在项目中连接第一年和最后一年,以便清楚地指示范围。
df.sort_values(by=['item','year']).groupby('item').agg( year=('year', lambda x: str(x.iloc[0]) +'-'+str(x.iloc[-1])),value=('value', lambda x: x.iloc[-1]-x.iloc[0]))
year value
item
A 2010-2012 12
B 2016-2019 20
我有一个 pandas DataFrame df
看起来像这样:
item year value
A 2010 20
A 2011 25
A 2012 32
B 2016 20
B 2019 40
B 2018 50
我的目标是能够为每个项目计算每个日期之间的价值差异。然后例如,我想找到项目 A:12(32 -20,因为最大年份是 2012 年,最小年份是 2010 年)和项目 B:20(40 - 20,因为最大年份是 2019 年,最小年份是 2016 年) .
我使用以下代码为每个项目获取最大年份和最小年份:
df.groupby("item").agg({'year':[np.min, np.max]})
然后,我找到每个项目的最小年份和最大年份。然而,我坚持做我想做的。
使用:
def fun(x):
return x[x.index.max()] - x[x.index.min()]
res = df.set_index("year").groupby("item").agg(fun)
print(res)
输出
value
item
A 12
B 20
通过 year
尝试 sort_values
,然后您可以 groupby
和 select first
min
和 last
max
:
g = df.sort_values('year').groupby('item')
out = g['value'].last() - g['value'].first()
输出:
item
A 12
B 20
Name: value, dtype: int64
在 agg 中使用 loc 访问器来计算值差,此外,您还可以在项目中连接第一年和最后一年,以便清楚地指示范围。
df.sort_values(by=['item','year']).groupby('item').agg( year=('year', lambda x: str(x.iloc[0]) +'-'+str(x.iloc[-1])),value=('value', lambda x: x.iloc[-1]-x.iloc[0]))
year value
item
A 2010-2012 12
B 2016-2019 20