在组内使用 pandas.shift()
- 2025-02-20 09:23:00
- admin 原创
- 27
问题描述:
我有一个包含面板数据的数据框,假设它是 100 个不同对象的时间序列:
object period value
1 1 24
1 2 67
...
1 1000 56
2 1 59
2 2 46
...
2 1000 64
3 1 54
...
100 1 451
100 2 153
...
100 1000 21
我想添加一个新列prev_value
来存储value
每个对象的先前信息:
object period value prev_value
1 1 24 nan
1 2 67 24
...
1 99 445 1243
1 1000 56 445
2 1 59 nan
2 2 46 59
...
2 1000 64 784
3 1 54 nan
...
100 1 451 nan
100 2 153 451
...
100 1000 21 1121
我可以用某种.shift()
方式.groupby()
来做到这一点吗?
解决方案 1:
Pandas 的分组对象有一个方法,它将移动每个组ngroupby.DataFrameGroupBy.shift
中的指定列,就像常规数据框的方法一样: periods
`shift`
df['prev_value'] = df.groupby('object')['value'].shift()
对于以下示例数据框:
print(df)
object period value
0 1 1 24
1 1 2 67
2 1 4 89
3 2 4 5
4 2 23 23
结果是:
object period value prev_value
0 1 1 24 NaN
1 1 2 67 24.0
2 1 4 89 67.0
3 2 4 5 NaN
4 2 23 23 5.0
解决方案 2:
如果您的 DataFrame 已经按分组键排序,则可以shift
对整个 DataFrame 和 溢出到下一个组的where
行使用单个分组NaN
键。对于包含多个组的较大 DataFrame,这可能会更快一些。
df['prev_value'] = df['value'].shift().where(df.object.eq(df.object.shift()))
object period value prev_value
0 1 1 24 NaN
1 1 2 67 24.0
2 1 4 89 67.0
3 2 4 5 NaN
4 2 23 23 5.0
一些与性能相关的时间:
import perfplot
import pandas as pd
import numpy as np
perfplot.show(
setup=lambda N: pd.DataFrame({'object': np.repeat(range(N), 5),
'value': np.random.randint(1, 1000, 5*N)}),
kernels=[
lambda df: df.groupby('object')['value'].shift(),
lambda df: df['value'].shift().where(df.object.eq(df.object.shift())),
],
labels=["GroupBy", "Where"],
n_range=[2 ** k for k in range(1, 22)],
equality_check=lambda x,y: np.allclose(x, y, equal_nan=True),
xlabel="# of Groups"
)
相关推荐
热门文章
项目管理软件有哪些?
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
热门标签
云禅道AD