【问题标题】:Create column with value one year later for every group in pandas一年后为熊猫中的每个组创建具有值的列
【发布时间】:2019-08-01 20:42:37
【问题描述】:

我正在使用以下格式的 DataFrame:

id    Period    value
 1    201308      A
 1    201309      A
         .
 1    201408      C
 1    201409      D
         .
         .
 2    201308      B
 2    201309      C
         .
 2    201408      A
 2    201409      B

我想创建一个列value_t1,其值为一年后,即Period+100。我设法做到了,但效率很低:

aux = df[['Period','value','id']].copy()
aux.rename(columns={'Period':'Period_t1','value':'value_t1'}, inplace=True)
df['Period_t1']=df.Period+100
df = df.merge(aux, on=['Period_t1','id'])

带来:

id    Period    value  Period_t1  value_t1
 1    201308      A     201408       C
 1    201309      A     201409       D
         .
         .
 2    201308      B     201408       A
 2    201309      C     201409       B
         .
         .

这是我需要的(不需要Period_t1 列)。我觉得必须有一个更有效的 1 或 2 班轮,可能使用shift()。你有什么想法吗?

谢谢

【问题讨论】:

  • 您的解决方案与我的非常相似。为什么它效率很低
  • 当我从同一数据集中检索数据时,合并似乎不是最佳选择
  • 这很自然地看起来像是一个合并问题。您当然可以set_index(['id', 'Period']) 并使用loc 访问。但是当未来日期不可用时,这会引发错误。
  • 检查我的答案,我终于设法实现了我想要的

标签: python pandas date


【解决方案1】:

试试:

df['Period_'] = df['Period'] + 100

(df.merge(df.drop('Period_', axis=1), 
          left_on=['id','Period_'],
          right_on=['id','Period'],
          suffixes=['','_t1'])
  .drop('Period_', axis=1)
)

输出:

   id  Period value  Period_t1 value_t1
0   1  201308     A     201408        C
1   1  201309     A     201409        D
2   2  201308     B     201408        A
3   2  201309     C     201409        B

【讨论】:

    【解决方案2】:

    设法做得更好,比预期的要容易:

    df['value_t1'] = df.groupby(['id']).value.shift(-12)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 2020-12-09
      • 2020-03-02
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 2022-01-18
      相关资源
      最近更新 更多