如何使用日期作为索引移动数据框的列后保存数据框

问题描述 投票:0回答:1

当我在带有日期索引的 df 列上使用 pandas 的 .shift() 时,我可以将它与 .corr() 一起使用,但我无法使用此函数更新我的旧 df 或创建新的 df

第一次尝试

我的 df 看起来像这样:

      Date    X    Y
2000-01-01   x1   y1
2000-02-01   x2   y2
2000-03-01   x3   y3
2000-04-01   x4   y4
2000-05-01   x5   y5
2000-06-01   x6   y6

我想像这样改变它:

      Date    X    Y
2000-01-01   NaN   NaN
2000-02-01   NaN   y1
2000-03-01   x1    y2
2000-04-01   x2    y3
2000-05-01   x3    y4
2000-06-01   x4    y5

我首先尝试更新我的旧 df:

# max_lag is a dictionary with lags for each feature / column in my df

for key in max_lag.keys():
    df[key].shift(periods=max_lag[key], freq='ME')

此代码不会导致任何错误,但在未使用移位值更新后会导致 df 错误。

第二次尝试

然后我尝试分配 df:


for key in max_lag.keys():

    df[key] = df[key].shift(periods=max_lag[key], freq='ME')

我收到此错误:

ValueError: cannot reindex on an axis with duplicate labels

第三次尝试

这次我创建了一个新的 df 来存储筛选后的值:




for key in max_lag.keys():



    df_shift[key] = df[key].shift(periods=max_lag[key], freq='ME')



错误:

TypeError: 'type' object does not support item assignment

我尝试过许多其他的小改变,但没有任何效果。我真的很感激任何帮助和解释我做错了什么。

python pandas python-datetime shift
1个回答
0
投票

您需要定义换档滞后:

import pandas as pd

data = {
    "Date": ["2000-01-01", "2000-02-01", "2000-03-01", "2000-04-01", "2000-05-01", "2000-06-01"],
    "X": ["x1", "x2", "x3", "x4", "x5", "x6"],
    "Y": ["y1", "y2", "y3", "y4", "y5", "y6"]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

max_lag = {'X': 2, 'Y': 1}

df_shifted = pd.DataFrame(index=df.index)
for key, lag in max_lag.items():
    df_shifted[key] = df[key].shift(periods=lag)

print(df_shifted)

这将为您带来预期的结果。

               X     Y
Date                  
2000-01-01  None  None
2000-02-01  None    y1
2000-03-01    x1    y2
2000-04-01    x2    y3
2000-05-01    x3    y4
2000-06-01    x4    y5

第一次尝试失败,因为

shift()
没有就地修改df,而是返回一个新的系列。因此,您需要显式地将结果重新分配回 df。您的第二次尝试使用
freq
是错误的,因为
freq
用于基于时间的轮班并引入重新索引问题,导致由于重复或冲突的索引而导致
ValueError
。第三次尝试失败,因为
df_shift
未正确初始化,导致当您尝试为其赋值时出现
TypeError

© www.soinside.com 2019 - 2024. All rights reserved.