数据::
Unnamed: 0 gvkey date CUSIP conm tic cik PERMNO COMNAM
0
0 1001 1983 00016510 A & M FOOD SERVICES INC AMFD. 723576.0 10015 NaN
1
1 1001 1983 00016510 A & M FOOD SERVICES INC AMFD. 723576.0 10015 A & M FOOD SERVICES INC
2
5 1001 1984 00016510 A & M FOOD SERVICES INC AMFD. 723576.0 10015 A & M FOOD SERVICES INC
3
17 1001 1985 00016510 A & M FOOD SERVICES INC AMFD. 723576.0 10015 A & M FOOD SERVICES INC
4
29 1003 1983 00035410 A.A. IMPORTING CO INC ANTQ 730052.0 10031 NaN
目标::
获取当年特定观测的 PERMNO(数据)
条件::
- 观察有 gvkey 数据
- 明年对该 gvkey 的观察有“COMNAM”变量的数据
例如;年 = 1983,gvkey = 1001,next_year = 1984
我尝试过的::
df = DATA
df[(df['date'] == year) & (df['date'] == gvkey) & (df[df['date'] == next_year]['COMNAM'].isna() != 1])]
但是,它返回,NO OBSERVATIONS..
我认为这是因为代码包含两个互斥的条件::df['date'] == Year 和 df['date'] == next_year
谁能给我建议吗?谢谢!
最佳答案
确保使用一致的掩码索引
pd.Series.isna
返回一个系列,而不是 bool 值。重要的是,因为您首先通过 df[df['date'] == next_year]
应用过滤器 bool 系列将不会具有与前两个蒙版相同的索引。
不要使用链式索引
您应该避免链式索引,即 explicitly discouraged in the docs 。相反,您可以找到范围内的年份,然后使用 pd.Series.isin
。最后,为了便于阅读,我建议您组合多个掩码:
m1 = df['date'].eq(year)
m2 = df['gvkey'].eq(gvkey)
viable_years = df.loc[m2 & df['COMNAM'].notnull(), 'date'].values # returns in-scope years
m3 = (df['date'] + 1).isin(viable_years) # check next year is a good year
res = df[m1 & m2 & m3]
关于python - 如何根据DataFrame中下一周期的观察来过滤观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52578749/