Pandas使用日期减去某些天数来连接历史数据

时间:2017-10-20 14:27:41

标签: python pandas

我有一个数据框,其中一列是Date(即5/29/2007),然后是col A和col B以及其他一些列。 col A和col B的日期和值唯一地标识该行。我想在数据框中添加列,这些列是其他列(不是A或B)的历史值。例如,我有一些行。将其称为行i并且它具有col D的一些值。我想在数据框中添加一列,该列对应于col D的值但是前一天。这是col D的值,其中行(称为行j)与col A和col B具有相同的行i,但日期是行i的日期减去一天。我怎样才能有效地做到这一点?

此外,我还想为多个列执行此操作,而不仅仅是col D.

这是我想要的一个例子。以下是我当前的数据框csv。

Date, col-A, col-B, col-C, col-D
5/29/2007, A, B, 0, 1
5/29/2007, AA, Bf, 7, 124
5/29/2007, AV, Bf, 1, 4
5/30/2007, A, B, 10, 1
5/30/2007, AA, Bf, 3, 1
5/30/2007, AV, Bf, 1, 8

这是我希望数据框具有的所需输出数据

Date, col-A, col-B, col-C, col-D, col-D-1
5/30/2007, A, B, 10, 1, 1
5/30/2007, AA, Bf, 3, 1, 124
5/30/2007, AV, Bf, 1, 8, 4

2 个答案:

答案 0 :(得分:1)

我会创建一个移位副本,然后与原始副本合并。

# shifted copy
shiftInterval = pd.Timedelta('-1 days') # your X days interval
dfShifted = df.copy()
dfShifted['Date'] = dfShifted['Date'] - shiftInterval
dfShifted.drop(['col-C'], axis=1, inplace=True)

# merge, keeping only observations where -1 lag is present
df2 = pd.merge(df,
           dfShifted,
           on=['Date','col-A','col-B'],
           how = 'inner', # use 'left' to keep observations without lags
           suffixes=['','-1'])

df2
#        Date col-A col-B  col-C  col-D  col-D-1
#0 2007-05-30     A     B     10      1        1
#1 2007-05-30    AA    Bf      3      1      124
#2 2007-05-30    AV    Bf      1      8        4

上述答案假设您有以下创建的可重现数据集

from io import StringIO
import pandas as pd
from datetime import datetime

df = pd.read_csv(StringIO("""Date,col-A,col-B,col-C,col-D
5/29/2007,A,B,0,1
5/29/2007,AA,Bf,7,124
5/29/2007,AV,Bf,1,4
5/30/2007,A,B,10,1
5/30/2007,AA,Bf,3,1
5/30/2007,AV,Bf,1,8"""))

df['Date'] = df['Date'].apply(lambda x: datetime.strptime(x, '%m/%d/%Y'))

这是一种手动黑客攻击,因为已经有移位功能。我之前尝试使用pandas.DataFrame.shift(),但无法使其与freq和索引配合使用。知道如何回答这个问题的人。

答案 1 :(得分:0)

df['E'] = [
 df.loc[
  (df['date']==(df.loc[row,'date']-pd.Timedelta('1 day')))&
  (df['A']==df.loc[row,'A'])&
  (df['B']==df.loc[row,'B'])
 ]['D'] for row in df.index]