gpt4 book ai didi

python - Pandas DataFrame 按日期移动列以创建滞后值

转载 作者:行者123 更新时间:2023-11-28 22:33:21 26 4
gpt4 key购买 nike

我有一个数据框:

df = pd.DataFrame({'year':[2000,2000,2000,2001,2001,2002,2002,2002],'ID':['a','b','c','a','b','a','b','c'],'values':[1,2,3,4,5,7,8,9]})

enter image description here

我想创建一个列,其中包含每个 ID 年的滞后值,例如,2000 年的 ID'a' 的值为 1,因此 2001 年的 ID'a' 的预值为1. 关键是如果一个ID在上一年没有值(所以对于某个ID来说年份不是连续的),那么前值应该是NaN,而不是两年前的值.例如,ID'c'在 2001 年没有出现,那么对于 2002 年,ID'c' 的前值应该为 NaN。理想情况下,最终输出应如下所示: enter image description here

我尝试了 df.groupby(['ID'])['values'].shift(1),但它给出了以下内容: enter image description here

问题是,当 ID'c' 在一年前没有值时,会使用两年前的值。我还尝试了 multiindex shift,结果相同。

df.set_index(['year','ID'], inplace = True)
df.groupby(level=1)['values'].shift(1)

有效的是提到的答案 here .但是由于我的数据帧相当大,合并会杀死内核。到目前为止,我还没有想出更好的方法来做到这一点。我希望我清楚地解释了我的问题。

最佳答案

假设 year 列对于每个 id 都是唯一的,即每个特定 id 没有重复的年份,那么您可以先移动该值,然后在年份之间的差异处替换移动的值当前行和上一行不等于 1NaN:

import pandas as pd
import numpy as np
df['pre_value'] = df.groupby('ID')['values'].shift(1)
df['pre_value'] = df.pre_value.where(df.groupby('ID').year.diff() == 1, np.nan)
df

enter image description here

关于python - Pandas DataFrame 按日期移动列以创建滞后值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40007033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com