熊猫:与分组数据

问题描述:

我用下面的DataFrame工作创造一个滞后柱:熊猫:与分组数据

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,并深入我的期望结果的性质:

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

这将返回

crsp['amtsum']=crsp[['date_crsp', 'cid', 'catcode', 'amount']].\ 
groupby(['date_crsp', 'catcode','cid']).amount.transform('sum') 
crsp['amtsum'] = crsp['amtsum']/1000 
crsp.drop(['amount'], axis=1, inplace=True) 
crsp.drop_duplicates(inplace=True, keep='first') 

我曾尝试使用下面的代码来获取滞后值尝试

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年的NaN,但不是2006年。我也选择d只能在2005年后才能获得相同的结果。有没有人有关于如何解决这个问题的线索?

您需要查看您的.groupby()逻辑。

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

结果

1 444508 
2  5281 
3  619 
4   3 

大部分的群体都只​​有一个值,所以没有太多的转变。不出所料,

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 

如果通过date_crsp.shift(),例如,你可能不希望在.groupby()使用它 - 每个小组随后将只包含一个单一的一年。人们期望在.groupby()中看到独特的组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) 

不知道数据有足够的了解什么标识您要滞后,很难提供一个更具体的答案群体。

+0

感谢您的意见和建议:

crsp['next_year'] = crsp['date_crsp'] + 1 
通过['next_year', 'catcode', 'cid']而不是['date_crsp', 'catcode', 'cid']

,然后GROUPBY 。我认识到没有独特的索引是一个问题。不幸的是,这不是一个“正常”的数据框。我搞砸了一些不同的想法,即根据'date_crsp'创建一个'date_crsp_lag'来查看是否可以工作。 –

+1

不客气,增加了另一个例子。 – Stefan

如果你想通过一个转移这些年来,准备年内新列:

crsp['amtsumlag.1'] = (crsp.groupby(['next_year', 'catcode', 'cid'])['amount'] 
         .transform('sum'))