python-3.x - Pandas:过滤掉包含两个期望值的行(唯一 ID)
问题描述
我有一个如下所示的数据框;
ID code
333_c_132 x
333_c_132 n06
333_c_132 n36
333_c_132 n60
999_c_133 x
999_c_133 n06
999_c_133 n12
999_c_133 n24
998_c_134 x
998_c_134 n06
998_c_134 n12
998_c_134 n18
998_c_134 n36
997_c_135 x
997_c_135 n06
997_c_135 n12
997_c_135 n24
997_c_135 n36
我想过滤掉同时包含x
和的行(唯一 ID) n36
。IE
ID code
333_c_132 x
333_c_132 n36
998_c_134 x
998_c_134 n36
997_c_135 x
997_c_135 n36
我像这样尝试过;
df = df[(df.code == "x") | (df.code == "n36")]
但它999_c_133 x
也会返回......我想避免。
解决方案
使用,Series.eq
创建一个布尔掩码m1
,m2
然后使用groupby
对掩码m1
& m2
on进行分组df[ID]
,现在用于transform(any)
创建一个布尔掩码,它满足ID
包含值m1
和m2
的编码,然后使用此掩码过滤数据帧:
m1 = df['code'].eq('x')
m2 = df['code'].eq('n36')
m = (
m1.groupby(df['ID']).transform('any') &
m2.groupby(df['ID']).transform('any') &
df['code'].isin(['x', 'n36'])
)
df1 = df[m]
# print(df1)
ID code
0 333_c_132 x
2 333_c_132 n36
8 998_c_134 x
12 998_c_134 n36
13 997_c_135 x
17 997_c_135 n36
推荐阅读
- tinymce - tinymce 在初始化后编辑编辑器时删除标尺插件
- python - 如何浏览 itertools 排列?
- date - 如何比较两个时间戳 - 仅因为一个具有时区而有所不同?
- python - Python Fbchat登录错误我该怎么办?
- java - Android辅助功能,如何删除所有按钮操作?
- python - 使用正则表达式以 html 文本格式捕获电子邮件地址
- scala - 如何在 spark jdbc savemode.overwrite 中进行异常处理?
- python - 使用 IF 语句在 Python 中进行输入选择
- sql - 表上的 SQL Server 哈希函数表示该表上的完整数据?
- javascript - 有没有办法使用另一个数组的元素动态创建一个新数组?