返回

如何根据值列表筛选特定列?pandas DataFrame 过滤指南

python

如何过滤 DataFrame 行:根据值列表筛选特定列

引言

在数据分析中,经常需要过滤 DataFrame 以筛选出满足特定条件的行。其中一种常见的场景是根据值列表筛选特定列。本文将介绍两种方法来使用 Python pandas 库执行此操作:query() 方法和 isin() 方法。

使用 query() 方法

query() 方法允许使用布尔表达式来过滤 DataFrame。我们可以利用 isin() 函数检查列值是否在指定的列表中。语法如下:

df.query("column_name in @value_list")

使用 isin() 方法

isin() 方法直接检查列值是否在指定的列表中。它返回一个布尔 Series,其中 True 表示值存在于列表中。然后,我们可以使用布尔索引来过滤 DataFrame。语法如下:

df[df['column_name'].isin(value_list)]

示例

假设我们有一个包含以下数据的 DataFrame:

df = pd.DataFrame({
    'STK_ID': ['600809', '600141', '600329', '600807', '600131'],
    'sales': [100, 200, 300, 400, 500]
})

要过滤出股票 ID 在指定列表中的行,我们可以使用以下方法:

stk_list = ['600809', '600141', '600329']
rst = df.query("STK_ID in @stk_list")

或者:

rst = df[df['STK_ID'].isin(stk_list)]

输出

   STK_ID  sales
0  600809   100
1  600141   200
2  600329   300

哪种方法更好?

这两种方法的效率取决于数据集的大小和值列表的长度。对于小型数据集和较短的值列表,isin() 方法通常更快。然而,对于较大的数据集和更长的值列表,query() 方法可能是更优的选择。

结论

本文介绍了两种方法来使用 pandas 库过滤 DataFrame 中的特定行,基于列中的值是否存在于指定的列表中。这些方法对于数据清理、数据探索和数据分析等任务非常有用。

常见问题解答

  • 我可以过滤多个列吗?
    是的,可以使用 & 运算符将多个布尔表达式组合到 query() 方法中。例如:

    df.query("column1 in @value_list1 & column2 in @value_list2")
    
  • 我可以在列表中使用 NaN 值吗?
    isin() 方法默认会忽略 NaN 值。如果需要包含 NaN 值,可以使用 na=False 参数。

  • 过滤是否可以基于其他 DataFrame 吗?
    是的,可以使用 merge()join() 方法将两个 DataFrame 合并在一起,然后根据合并后的列进行过滤。

  • 如何处理重复值?
    isin() 方法将返回所有重复项。如果需要去除重复项,可以使用 drop_duplicates() 方法。

  • 是否有其他方法可以过滤 DataFrame?
    除了上述方法之外,还可以使用 mask()loc()iloc() 方法进行过滤。