【问题标题】:Creating lagged variable创建滞后变量
【发布时间】:2019-11-30 02:03:02
【问题描述】:

我想创建一个 Total_Damages 的滞后变量。

   `Company_name` Year      Total_Damages ROA
   `ABC`          1996      1111          `2`
   `ABC`          1998      2422          `2`
   `ABC`          1999      3232          `9`
   `ASD`          1996      2132          `1`
   `ASD           1997      3444          `12`
   `ASD`          1998      200           `1`
   `ASD`          1999      1987          `12`

所有变量都需要移到一年后。理想的结果如下所示:

Year   `Total_Damages` ROA
1996   `Nan`           `2`
1997   `1111`          `Nan`
1998   `Nan`           `2`
1999   `2422`          `Nan`
1999   `Nan`           `9`
2000   `3232`          `Nan`
1996   `Nan`           `1`
1997   `2132`          `Nan`
1997   `Nan`           `12`
1998   `3444`          `Nan`
1998   `Nan`           `1`
1999   `200`           `Nan`
1999   `Nan`           `12`
2000   `1987`          `Nan`

我使用了这段代码,但它没有提供想要的结果:

df.loc[:,'Total_Damages_lag'] = df.groupby('Year')['Total_damages'].shift(1)

此外,我使用了以下代码,它确实有效。但是,我的数据框随后变成了一个列表。如果我将其转换回来,则大部分行都会被删除。

grouped_df = df.groupby(df['company_name'])


def lag_by_group(key, value_df):
    df = value_df.assign(company_name = key)
    return (df.sort_values(by=["Year"], ascending=True).set_index(["Year"]).shift(1))

df = [lag_by_group(g, grouped_df.get_group(g)) for g in grouped_df.groups.keys()]
pd.concat(df, axis=0)

我怎样才能以不同的方式滞后我的变量或解决我的列表问题?

【问题讨论】:

  • 您的预期输出与输入完全相同。只需将年份加 1 或将索引移 1。我不遵循计算
  • 您的输入非常混乱,因为日期是重复的。但是,stackoverflow.com/questions/58295815/… 应该回答您的问题,如果没有重复(或者有另一列区分重复)。修改年份后与自身合并
  • 现在您的预期输出没有意义。你为什么想要那个?
  • 我很抱歉。我编辑了我的帖子。希望这可以解决问题。
  • @roganjosh 我有两个变量,即 ROA 和 Total_damages。我只需要滞后 Total_damages。我认为结果会是这样。

标签: python pandas


【解决方案1】:

您可以使用以下代码:

df.year=df.year+1

【讨论】:

    【解决方案2】:

    一种方法是只创建数据帧的两个副本,然后手动创建“滞后”格式。

    请注意,如果您提供一种在问题中创建数据框本身的方法,则回答此类问题会容易得多。我添加了前三行的示例。

    import pandas as pd
    
    import numpy as np
    temp = {'Company_name': ['ABC']*3,
            'Year': [1996, 1998, 1999],
            'Total_Damages': [1111, 2422, 3232],
            'ROA': [2, 2, 9]}
    
    df = pd.DataFrame(temp)
    
    df1 = df.copy()
    df2 = df.copy()
    print(df)
    #Output:
      Company_name  Year  Total_Damages  ROA
    0          ABC  1996           1111    2
    1          ABC  1998           2422    2
    2          ABC  1999           3232    9
    

    现在,对于上半部分,我们只需将 Total_Damages 设置为 null,因为它们将“滞后”1 年。

    df1['Total_Damages'] = pd.np.nan
    print(df1)
    #Output:
      Company_name  Year  Total_Damages  ROA
    0          ABC  1996            NaN    2
    1          ABC  1998            NaN    2
    2          ABC  1999            NaN    9
    

    对于下半部分,我们增加年份,并将非滞后列设置为空(本例中为 ROA)

    df2['Year'] += 1
    df2['ROA'] = pd.np.nan
    print(df2)
    #Output:
      Company_name  Year  Total_Damages  ROA
    0          ABC  1997           1111  NaN
    1          ABC  1999           2422  NaN
    2          ABC  2000           3232  NaN
    

    最后,将数据框连接在一起,并对索引进行排序,以获得彼此相邻的正确行。

    out = pd.concat([df1, df2]).sort_index().reset_index(drop=True)
    print(out)
    #Output:
      Company_name  Year  Total_Damages  ROA
    0          ABC  1996            NaN  2.0
    1          ABC  1997         1111.0  NaN
    2          ABC  1998            NaN  2.0
    3          ABC  1999         2422.0  NaN
    4          ABC  1999            NaN  9.0
    5          ABC  2000         3232.0  NaN
    

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 2018-07-04
      相关资源
      最近更新 更多