for 循环内的 for 循环在第一次运行后不执行

问题描述 投票:0回答:1

我有一个公司数据集,其中年份为 1960-1989 年,月份为 (1-12),如下所示。

永久号码。 年份
10057 1960 1
10057 1960 2
10057 1960 3
10057 1960 4
10057 1960 5
10057 1960 6
10057 1960 7
10057 1960 ...
10057 1961 1
10057 1961 2
10057 1961 3
10057 1961 4
10057 1961 5
10057 1961 6
10057 1961 7
10057 1961 ...
10057 1989 1
10057 1989 2
10057 1989 3
10057 1989 4
10057 1989 5
10057 1989 6
10057 1989 7
10057 1989 ...
11857 1960 1
11857 1960 2
11857 1960 3
11857 1960 4
11857 1960 5
11857 1960 6
11857 1960 7
11857 1960 ...

我想要做的是对于每个公司(PERMNO)的七月每个月,我想要它之前的所有行。例如,对于 1960 年 7 月的公司 10057,我想要从 1960 年 1 月到 1960 年 7 月开始的所有行,对于同一公司 10057,对于 1961 年 7 月,我想要从 1960 年 1 月到 1961 年 7 月开始的所有行等等。像这样:

永久号码。 年份
10057 1960 1
10057 1960 2
10057 1960 3
10057 1960 4
10057 1960 5
10057 1960 6
10057 1960 7
10057 1960 1
10057 1960 2
10057 1960 3
10057 1960 ...
10057 1961 4
10057 1961 5
10057 1961 6
10057 1961 7
10057 1960 1
10057 1960 ...
10057 1961 1
10057 1961 ...
10057 1962 6
10057 1962 7

每个公司以及每个公司内部,整个七月都是如此。

我已经在循环中编写了一个循环。第一家公司工作了,但从第二家开始,循环开始返回从 1960 年初到 1980 年底的所有行。不确定我在循环中哪里做错了。

这是我的代码:

permnolist = CRSP2.drop_duplicates('PERMNO').PERMNO.to_list()
LL = []
for indexer in permnolist:
    df = CRSP2[CRSP2['PERMNO']==indexer]
    july_list = df[df['Month']==7].Month.index.to_list()
    for indexer2 in july_list:
        df2 = df.iloc[:indexer2]
        LL.append(df2)

我列出了所有独特的公司。第一个循环尝试获取第一家公司的数据帧,第二个循环使用 Month=July 的行的索引(是的,我已经重置了索引)。我使用 iloc 获取 7 月之前的所有行。第一家公司工作得很好,但一旦循环到第二家公司,它就开始多次返回该公司从 1960 年初一直到 1980 年底的所有行。

python pandas dataframe for-in-loop
1个回答
0
投票

如果您输入示例数据,您可以执行以下操作:

# Filter rows where id=1 and month <= 7
filtered_df = df[(df["PERMNO"] == 10057) & (df["Month"] <= 7)]
print(filtered_df)

准确输出您所描述的输出:

PERMNO. Year    Month
10057   1960    1
10057   1960    2
10057   1960    3
10057   1960    4
10057   1960    5
10057   1960    6
10057   1960    7
10057   1960    1
10057   1960    2
10057   1960    3
10057   1960    ...
10057   1961    4
10057   1961    5
10057   1961    6
10057   1961    7
10057   1960    1
10057   1960    ...
10057   1961    1
10057   1961    ...
10057   1962    6
10057   1962    7
© www.soinside.com 2019 - 2024. All rights reserved.