pandas - 通过在行中查找 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。
解决方案
您可以依靠列表理解来提高性能:
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)
推荐阅读
- google-apps-script - 从谷歌电子表格中以 JSON 格式下载信息
- javascript - 如何在电子 js 中读取按钮单击事件?
- php - laravel,在另一个表的下拉列表中显示数据,但保存在当前表中
- node.js - 使用强大的文件上传不起作用
- python - DataFrame.to_csv() 超出单元格中的值
- .net - Visual Studio 2019 无法以 4.8 为目标,尽管它在控制面板中显示为已安装在机器上
- android - 从源代码构建 Android 8.1.0 并包含 SIMCOM 补丁失败
- linux - Azure 部署代理 (azagent) 恶魔在重新启动后未启动
- r - 在 R 中自动组合数据帧
- postfix-mta - iRedMail:域别名不适用于外部邮件