【问题标题】:Pandas concat historical data using date minus some number of days熊猫使用日期减去一些天数来连接历史数据
【发布时间】:2017-10-21 01:15:58
【问题描述】:

我有一个数据框,其中一列是日期(即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

【问题讨论】:

  • 我没有足够的想象力来创建您的示例数据...
  • 我添加了示例数据。让我知道它是否以某种方式模棱两可,我会尝试消除歧义
  • 您想要一排延迟还是一天延迟?见pd.DataFrame.shift()
  • @C8H10N4O2 我想要一个(或一个 x)天的延迟

标签: python pandas


【解决方案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 和索引一起使用。知道如何回答这个问题的人。

【讨论】:

  • 请注意,col-D-1 被强制浮动,因为 pandas 中的 some stupid reason 没有 NA 整数
  • 这是否可以通过以某种方式删除所有带有 NA 的行来解决?
  • @user3494047 请参阅编辑。如果您不关心保留具有 NA 值的行,您可以使用 how='inner' 并且所有内容都会出现 int64
  • 请注意,您要减去移位副本中的移位,因为这是您希望它加入 to 的日期。如果更容易想到正滞后并添加滞后,则翻转两个符号。
【解决方案2】:
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]

【讨论】:

  • 我试过了,还是不行。可能我只需要玩弄它。我会检查
猜你喜欢
  • 2020-12-30
  • 2018-11-15
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多