python - 如何根据DataFrame中下一周期的观察来过滤观察

标签 python pandas dataframe

数据::

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(数据)

条件::

  1. 观察有 gvkey 数据
  2. 明年对该 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/

相关文章:

python - 找出并记录 pandas 中失败的验证条件

python - 如何使用 python pandas 从 dict 类型数据框中删除重复项?

python - 从 csv 堆叠文件创建 pandas DataFrame

python - 多索引数据框到具有新列的数据透视表

python - 使用 FeatureUnion 拟合管道时出现 IndexError

Python:如何通过排除第三个目录来使用 tarfile 模块获取 tar

python - 计算Series的局部时间导数

python - 使用 pytz 的日期时间时区转换

python - 使用字典中的值在多列上过滤 pandas 数据框以进行部分字符串匹配

如果行数为奇数,则从数据框中删除随机行