我有一个数据框,其中一列是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
答案 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]