2016-05-14 169 views
0

我用下面的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年後才能獲得相同的結果。有沒有人有關於如何解決這個問題的線索?

回答

1

您需要查看您的.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

1

如果你想通過一個轉移這些年來,準備年內新列:

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