我有一个如下所示的数据框:
df = {'time': [1999,2001,2002,2003,2007,1999,2000,2001,2003,2004],
'id':['A','A','A','A','A','B','B','B','B','B'],
'value':[0.1,0.1,0.1,0.1,0.6,0.2,0.2,0.2,0.2,0.2]}
df = pd.DataFrame(df)
我想从中创建一个id-time
级别的面板数据集,这意味着,我想要类似的东西:
time id value
0 2001 A 0.1
1 2002 A 0.1
2 2003 A 0.6
3 1999 B 0.2
4 2000 B 0.2
5 2001 B 0.2
仅留下每个id
的连续行,我只需在R中几行即可完成此操作,
df<-df %>%
mutate(time = as.integer(time)) %>%
group_by(gvkey, grp = cumsum(c(1, diff(time) != 1))) %>%
filter(n() >= consec_obs)
df<-df[,setdiff(colnames(df),c('grp'))]
其中 consec_obs
是要保留的最小连续行。
我搜索了一段时间但找不到解决方案,这让我有点惊讶,因为这是一种基本的计量经济学分析操作,有人知道如何用 Python 做到这一点吗?
最佳答案
模仿 R 解决方案,我在周日晚上想出了一个 Python 版本,如下:
# lag where two rows within each group are not conesecutive
df['diff'] = df.groupby('id')['time'].diff()!=1
# cumulative summation
df['cusm'] = df.groupby('id')['diff'].cumsum()
# group by 'id' and 'cusm', then select those rows which satisfy prespecified condition
df.loc[df.groupby(['id','cusm']).transform('count')['diff'] >=3].drop(['diff','cusm'],axis=1)
如果这看起来有点难以理解,请尝试一行代码,您就会到达那里。
是否可以将前两行合并为一行?
关于python - pandas,查找并保留连续行 - 创建面板数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52807040/