[英]pandas create column as lagged difference of two other columns grouped by key
[英]Pandas: creating a lagged column with grouped data
我正在使用以下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['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')
我嘗試使用以下代碼獲取滯后值:
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年有NaN
而不是2006年。我還只選擇了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
例如,如果要使用.shift()
進行.shift()
, date_crsp
可能不希望在.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)
如果沒有足夠的數據來了解什么可以識別您要落后的群體,很難提供更具體的答案。
如果要將年份移位一位,請准備新的年份列:
crsp['next_year'] = crsp['date_crsp'] + 1
然后按['next_year', 'catcode', 'cid']
而不是['date_crsp', 'catcode', 'cid']
:
crsp['amtsumlag.1'] = (crsp.groupby(['next_year', 'catcode', 'cid'])['amount']
.transform('sum'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.