熊猫:与分组数据
问题描述:
我用下面的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)
不知道数据有足够的了解什么标识您要滞后,很难提供一个更具体的答案群体。
答
如果你想通过一个转移这些年来,准备年内新列:
crsp['amtsumlag.1'] = (crsp.groupby(['next_year', 'catcode', 'cid'])['amount']
.transform('sum'))
感谢您的意见和建议:
通过['next_year', 'catcode', 'cid']
而不是['date_crsp', 'catcode', 'cid']
,然后GROUPBY 。我认识到没有独特的索引是一个问题。不幸的是,这不是一个“正常”的数据框。我搞砸了一些不同的想法,即根据'date_crsp'创建一个'date_crsp_lag'来查看是否可以工作。 –
不客气,增加了另一个例子。 – Stefan