如何筛选pandas DataFrame保留特定值及排除含非二进制数值的行
嘿,这两个pandas的操作其实挺常用的,我来给你详细讲讲怎么实现:
1. 如何筛选pandas DataFrame,使其仅包含特定值?
这个需求可以分两种常见场景,咱们分别来看:
场景1:筛选某一列中包含特定值的行
如果只是想保留某列等于特定值的行,用isin()方法就很方便。比如你要保留AB列值为1的行:
# 筛选AB列值为1的行 filtered_df = df[df['AB'].isin([1])]
如果要匹配多个特定值,直接把值放进列表里就行,比如df[df['AB'].isin([0,1])]就能保留AB列是0或1的行。
场景2:筛选整个DataFrame中所有元素都属于特定值集合的行
要是你想保留所有单元格的值都在特定集合里的行(比如只保留全是0和1的行),可以结合isin()和all()来实现:
# 保留所有元素都是0或1的行 filtered_df = df[df.isin([0,1]).all(axis=1)]
2. 如何排除任意列包含非二进制(0或1)数值的行?
你的需求是:只要某一行里任意一列出现非0/1的数,就删掉这行。咱们可以用反向逻辑来实现:
首先,创建一个布尔掩码,标记出所有元素都在{0,1}范围内的行:
# 检查每一行的所有元素是否都是0或1 mask = df.isin([0, 1]).all(axis=1)
然后用这个掩码筛选DataFrame,只保留符合条件的行(也就是排除了有非二进制值的行):
# 得到仅包含二进制值的行 cleaned_df = df[mask]
咱们用你给的示例数据测试一下:
import pandas as pd array = [[1, 0, 0, 0, 0, 0, 2], [1, 0, 0, 1, 0, 0, 0], [2, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0], [1, 0, 0, 3, 0, 0, 0]] df = pd.DataFrame(array, columns = ['AB','AC','CB','DE','FA','CD','AF'] ) mask = df.isin([0,1]).all(axis=1) cleaned_df = df[mask] print(cleaned_df)
运行后得到的结果就是原DataFrame的第1和第3行(对应索引1和3),正好符合你要删除第0、2、4行的需求。
如果你想直接修改原DataFrame,可以用df.drop(df[~mask].index, inplace=True),不过一般更推荐创建新的DataFrame,避免误改原始数据。
内容的提问来源于stack exchange,提问作者Jiamei
相关产品推荐
相关产品推荐

