簡體   English   中英

大熊貓:使用分組數據創建滯后列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM