Pandas:使用分组d创建滞后列

2024-09-27 23:21:44 发布

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

{cdm>使用以下内容:

url='https://raw.githubusercontent.com/108michael/ms_thesis/master/crsp.csv'

df=pd.read_csv(url)

df.head()

    feccandid   fec.dyn feccf   cid     date_crsp   catcode     amtsum
0   S8VT00018   NaN     NaN     N00000534   2005    J2100        2.1
1   S8VT00018   NaN     NaN     N00000534   2005    L1200        5.0
2   S8VT00018   NaN     NaN     N00000534   2005    J7300        0.0
4   S8NM00127   0.561   0.382   N00015616   2006    G2900        2.5
5   S8NJ00350   -0.329  NaN     N00000854   2005    LG000        7.5

我想将amtsum值按年份延迟。下面的代码显示了我如何派生amtsum,并深入了解了我所期望的结果的性质:

^{pr2}$

我尝试使用以下代码获取滞后值:

crsp['amtsumlag.1']=crsp.groupby(['date_crsp','catcode', 'cid'])['amtsum'].shift(1)

这就回来了

    feccandid   fec.dyn     feccf   cid     date_crsp   catcode     amtsum  amtsumlag.1
0   S8VT00018   NaN     NaN     N00000534   2005       J2100    2.1     NaN
1   S8VT00018   NaN     NaN     N00000534   2005       L1200    5.0     NaN
2   S8VT00018   NaN     NaN     N00000534   2005       J7300    0.0     NaN
4   S8NM00127   0.561   0.382   N00015616   2006       G2900    2.5     NaN
5   S8NJ00350   -0.329  NaN     N00000854   2005       LG000    7.5     NaN

由于我的date_crsp范围是从2005年到2014年,我预计2005年的范围是{},但2006年不会。我也只选择了2005年以后的日期,得到了同样的结果。有人知道如何解决这个问题吗?在


Tags: csvurldfdatenanfecciddyn
2条回答

您需要研究一下您的.groupby()逻辑。在

crsp.groupby(['date_crsp','catcode', 'cid']).size().value_counts()

结果

^{pr2}$

大多数组只有一个值,所以没有太多的值可以改变。不出所料

crsp['amtsumlag.1'] = crsp.groupby(['catcode', 'cid', 'date_crsp'])['amtsum'].shift(1)

结果:

Data columns (total 8 columns):
feccandid             456939 non-null object
feccandcfscore.dyn    445710 non-null float64
feccandcfscore        355887 non-null float64
cid                   456939 non-null object
date_crsp             456939 non-null int64
catcode               456939 non-null object
amtsum                456939 non-null float64
amtsumlag.1           6528 non-null float64

例如,如果您想.shift(),那么您可能不想在.groupby()中使用它,那么每个组只包含一年。人们期望在.groupby()中看到唯一的group id变量,理想情况下是DateTimeIndex,或者是排序的DataFrame。所以.sort_values('date_crsp')可能是个好主意。在

crsp['amtsumlag.1'] = crsp.sort_values('date_crsp').groupby(['catcode', 'cid'])['amtsum'].shift(1)

取而代之的是:

feccandid             456939 non-null object
feccandcfscore.dyn    445710 non-null float64
feccandcfscore        355887 non-null float64
cid                   456939 non-null object
date_crsp             456939 non-null int64
catcode               456939 non-null object
amtsum                456939 non-null float64
amtsumlag.1           301280 non-null float64
dtypes: float64(4), int64(1), object(3)

如果没有足够的数据来了解你试图滞后的群体的身份,很难提供更具体的答案。在

如果您想将年份转换为一个,请准备一个新的年份列:

crsp['next_year'] = crsp['date_crsp'] + 1

然后按['next_year', 'catcode', 'cid']而不是['date_crsp', 'catcode', 'cid']分组:

^{pr2}$

相关问题 更多 >

    热门问题