我看过很多帖子问这个问题,但无法使用我的数据集。
我有一个包含摘要信息的数据框(从
.groupby
和 describe()
操作输出)。
data = [
[123456, "2017", 8.0, 150.235],
[123456, "2018", 8.0, 202.5],
[123456, "2019", 7.0, 168.526],
[123456, "2020", 6.0, 175.559],
[123456, "2021", 8.0, 206.667],
[789101, "2017", 8.0, 228.9],
[789101, "2018", 5.0, 208]
]
df = pd.DataFrame(
data,
columns=[
"ID",
"year",
"count",
"mean",
],
)
df
我正在尝试做两件事:
ID
内从 year
到 year
的百分比变化。ID
的百分比变化,即从第一个 year
到最新的 year
总体百分比变化是多少。我尝试过的事情:
df["pct_ch"] = df.groupby(["ID", "year"])["mean"].apply(pd.Series.pct_change) + 1
按照这里的建议,不幸的是这会返回所有NaN
的列。df["pct_change"] = df.groupby(["ID", "year"])["mean"].pct_change(-1)
按照建议here,它还会返回所有 NaN
值的列。我很好奇我做错了什么(为什么我得到了所有
NaN
以及如何计算这些百分比变化列?
不应该按年份分组,直接
groupby.pct_change
即可:
df['pct_ch'] = df.groupby('ID')['mean'].pct_change()
通过将年份设置为组,您的组仅包含one行,并且无需计算。
输出:
ID year count mean pct_ch
0 123456 2017 8.0 150.235 NaN
1 123456 2018 8.0 202.500 0.347888
2 123456 2019 7.0 168.526 -0.167773
3 123456 2020 6.0 175.559 0.041732
4 123456 2021 8.0 206.667 0.177194
5 789101 2017 8.0 228.900 NaN
6 789101 2018 5.0 208.000 -0.091306