嵌套for循环处理PERMNO月度数据异常:首企业正常后续失效
问题根源
你犯了两个关键错误:
混淆了索引标签与iloc位置参数
CRSP2[CRSP2['PERMNO']==indexer]生成的企业子df保留了原数据集的索引标签,而iloc[:indexer2]中的indexer2是原数据集的索引值(比如100、200这类),但iloc是按**行的位置(从0开始的整数)**切片的。当后续企业的子df索引标签远大于自身行数时,iloc[:indexer2]会直接返回子df的所有行(因为子df没有那么多行),就出现了全量数据的问题。
比如第二个企业的子df只有360行(1960-1989共30年),但它的7月对应的原索引是500,iloc[:500]会返回整个子df。切片范围未包含7月行
即使索引标签和位置一致,iloc[:indexer2]是左闭右开区间,不会包含indexer2对应的7月行,不符合你“提取到对应7月所有行”的需求。
修正方案
最简洁的方法是重置子df的索引,让索引标签与行位置完全对应,再获取7月行的位置进行切片:
permnolist = CRSP2.drop_duplicates('PERMNO').PERMNO.to_list() LL = [] for permno in permnolist: # 筛选当前企业数据并重置索引(drop=True删除原索引列) df = CRSP2[CRSP2['PERMNO'] == permno].reset_index(drop=True) # 获取所有7月行的位置(此时索引就是行位置) july_positions = df[df['Month'] == 7].index.to_list() for pos in july_positions: # 切片包含7月行,所以用[:pos+1] df_slice = df.iloc[:pos + 1] LL.append(df_slice)
其他优化思路
如果不想重置索引,可以直接获取7月行在子df中的位置:
permnolist = CRSP2.drop_duplicates('PERMNO').PERMNO.to_list() LL = [] for permno in permnolist: df = CRSP2[CRSP2['PERMNO'] == permno] # 遍历每个7月的行 for july_row in df[df['Month'] == 7].itertuples(): # 获取该行在子df中的位置 pos = df.index.get_loc(july_row.Index) # 切片包含7月行 df_slice = df.iloc[:pos + 1] LL.append(df_slice)
内容的提问来源于stack exchange,提问作者Jingy
相关产品推荐
相关产品推荐

