繁体   English   中英

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

[英]Pandas DataFrame shift columns by date to create lag values

我有一个数据框:

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]})

在此处输入图片说明

我想创建一个具有每个ID年的滞后值的列,例如,2000年的ID'a'的值为1,因此2001年的ID'a'的预值为1。关键是,如果一个ID在上一年没有值(因此,对于某个ID,该年份不是连续的),则该前值应为NaN,而不是两年前的值。 例如,ID'c'不会在2001年出现,然后对于2002年,ID'c'应该具有pre-value = NaN。 理想情况下,最终输出应如下所示: 在此处输入图片说明

我尝试了df.groupby(['ID'])['values']。shift(1),但它提供了以下内容: 在此处输入图片说明

问题是,当ID'c'一年前没有值时,将使用两年前的值。 我还尝试了多索引移位,这给了我相同的结果。

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

起作用的是这里提到的答案。 但是由于我的数据帧很大,因此合并会杀死内核。 到目前为止,我还没有找到更好的方法。 我希望我能清楚地解释我的问题。

假设每个ID的year列都是唯一的,即每个特定的id没有重复的年份,那么您可以先移动该值,然后替换在当前行和上一行的年之间的差不相等的情况下移动的值NaN1

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

在此处输入图片说明

reindex方法

def reindex_min_max(df):
    mn = df.year.min()
    mx = df.year.max() + 1
    d = df.set_index('year').reindex(pd.RangeIndex(mn, mx, name='year'))
    return pd.concat([d, d['values'].shift().rename('pre_value')], axis=1)

df.groupby('ID')[['year', 'values']].apply(reindex_min_max) \
    .sort_index(level=[1, 0]).dropna(subset=['values']).reset_index()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM