我有一个公司数据集,其中年份为 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 年底的所有行。
如果您输入示例数据,您可以执行以下操作:
# 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