创建滞后变量b

2024-09-25 08:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个滞后变量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)

如何以不同的方式延迟变量或修复列表问题?你知道吗


Tags: 代码namedfbygroupnanyearlag
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

现在,对于上半年,我们只需将总损失设置为空,因为它们将“滞后”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

对于下半部分,我们增加年份,并将非滞后列设置为null(本例中为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

您可以使用以下代码:

df.year=df.year+1

相关问题 更多 >