首页 > 解决方案 > 通过在行中查找 NumPy 数组匹配来有效过滤 DataFrame

问题描述

给定

df = pd.DataFrame({'x': [np.array(['1', '2.3']), np.array(['30', '99'])]},
                  index=[pd.date_range('2020-01-01', '2020-01-02', freq='D')])

我想过滤np.array(['1', '2.3']). 我可以

df[df['x'].apply(lambda x: np.array_equal(x, np.array(['1', '2.3'])))]

但这是最快的方法吗?

编辑: 让我们假设 numpy 数组中的所有元素都是字符串,即使这不是一个好习惯!

DataFrame 长度可以达到 500k 行,每个 numpy 数组中的值的数量可以达到 10。

标签: pandasnumpy

解决方案


您可以依靠列表理解来提高性能:

df[np.array([np.array_equal(x,np.array([1, 2.3])) for x in df['x'].values])]

性能通过timeit(在我当前使用 4gb ram 的系统上):

%timeit -n 2000 df[np.array([np.array_equal(x,np.array([1, 2.3])) for x in df['x'].values])]
#output:
425 µs ± 10.8 µs per loop (mean ± std. dev. of 7 runs, 2000 loops each)

%timeit -n 2000 df[df['x'].apply(lambda x: np.array_equal(x, np.array([1, 2.3])))]
#output:
875 µs ± 28.6 µs per loop (mean ± std. dev. of 7 runs, 2000 loops each)

推荐阅读