python - pandas,查找并保留连续行 - 创建面板数据

标签 python pandas-groupby panel-data

我有一个如下所示的数据框:

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/

相关文章:

r - 在 R 中查看 plm 输出中的所有估计值

R plm lag - 什么相当于 Stata 中的 L1.x?

python - 每次 Spark 窗口函数

python - 在 SQLite 或 Python 中聚合

python - Seaborn 通过多个 groupby 绘制 pandas 数据框

python - Pandas:如果组的大小大于平均值,则删除行

r - 对 xts 数据进行排序,使其看起来像 R 中的面板数据

python - 使用 Pygame, Python 3 Blitting 非矩形 Sprite

python - Python 中的 MCTS *树* 并行化 - 可能吗?

python - 根据另一列的日期和标志过滤掉行