Pandas:使用分组数据创建滞后列
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)
这个returns
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()
到 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'))
我正在使用以下 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)
这个returns
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()
到 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'))