python - 如何过滤多年数据框以保留所有年份值的行
问题描述
我有一个多年的每日数据框,它在不同的年份(Col2)中存在不同的实体(Col1)。我正在尝试过滤数据框,使其仅保留在每个指定年份中具有值的那些行。(我从日期时间索引创建了 Col2 认为它会使过滤过程更容易)
换句话说,我正在尝试设计一个条件过滤器,其中保留满足另一列条件的列值。
这是我的数据框:
Date Col1 Col2 Col3 Col4
1/1/16 M 2016 34 a
2/2/16 M 2016 35 f
3/3/16 M 2016 45 d
1/1/17 S 2017 66 ff
2/2/17 S 2017 66 mn
1/1/18 T 2018 78 jh
2/2/18 T 2018 789 kk
1/1/17 M 2017 100 f
2/2/17 S 2017 2020 jj
2/2/18 M 2018 3005 m
实体 M、S 和 T 在 2016-2019 年记录了价值,但只有 M 在所有三年中都有价值。
因此,生成的数据框应如下所示:
Date Col1 Col2 Col3 Col4
1/1/16 M 2016 34 a
2/2/16 M 2016 35 f
3/3/16 M 2016 45 d
1/1/17 M 2017 100 f
2/2/18 M 2018 3005 m
我正在尝试通过以下代码行来计算逻辑,但没有任何工作:
(1)
years = [2016,2017,2018]
for station in df_in['Col1']:
years = [2016,2017,2018]
if df_in['Col2'].isin(years).any():
df = df_in
else:
df = df_in.drop(df_in[df_in.Col1].index)
或者
(2)
df= df_in['Col1'].apply(lambda x: x in df_in['year'].isin(years))
或者
(3)
df = df_in.loc[(df_in['Col1']) & (df_in['Col2'].isin(years))]
什么是实现这一目标的好方法?
任何帮助都感激不尽。
解决方案
如果需要仅比较year
s 列表中的值,则比较GroupBy.transform
掩码中相等的集合,然后过滤boolean indexing
:
years = [2016,2017,2018]
df1 = df[df.groupby('Col1')['Col2'].transform(lambda x: set(x) == set(years))]
print (df1)
Date Col1 Col2 Col3 Col4
0 1/1/16 M 2016 34 a
1 2/2/16 M 2016 35 f
2 3/3/16 M 2016 45 d
7 1/1/17 M 2017 100 f
9 2/2/18 M 2018 3005 m
如果要比较列表中的现有值,并且每组可能有一些其他值比较高或相等:
print (df)
Date Col1 Col2 Col3 Col4
0 1/1/16 M 2019 34 a <- 2019
1 2/2/16 M 2016 35 f
2 3/3/16 M 2016 45 d
3 1/1/17 S 2017 66 ff
4 2/2/17 S 2017 66 mn
5 1/1/18 T 2018 78 jh
6 2/2/18 T 2018 789 kk
7 1/1/17 M 2017 100 f
8 2/2/17 S 2017 2020 jj
9 2/2/18 M 2018 3005 m
years = [2016,2017,2018]
df1 = df[df.groupby('Col1')['Col2'].transform(lambda x: set(x) >= set(years))]
print (df1)
Date Col1 Col2 Col3 Col4
0 1/1/16 M 2019 34 a
1 2/2/16 M 2016 35 f
2 3/3/16 M 2016 45 d
7 1/1/17 M 2017 100 f
9 2/2/18 M 2018 3005 m
推荐阅读
- python - 导入模块时出现问题:ModuleNotFoundError:没有名为“torch.utils.checkpoint”的模块
- swift - 斯威夫特:为什么这个称呼模棱两可?
- python - 我可以加快我在 python 中读取和处理许多 .csv 文件的速度吗?
- linux - 如何在嵌入式环境中避免 DBus for Linux?
- r - 在 R 中,如何通过在 192 个数据帧上运行函数来节省空间?
- mysql - 编码所有列
- c - 在 do-while 循环中使用无符号整数
- python - 如何将 python 程序的标准输出输入 Popen 标准输入?
- sensors - Arduino 激光检测 - 光敏电阻或激光传感器模块?
- java - 构建部分中的 Maven 版本范围