You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:40:11