python - 使用 Numpy 过滤两个数据帧
问题描述
我有两个数据框。它们的结构如下:
自由度
信 | ID |
---|---|
一种 | 3 |
乙 | 4 |
自由度
信 | ID | 价值 |
---|---|---|
一种 | 3 | 100 |
乙 | 4 | 300 |
乙 | 4 | 100 |
乙 | 4 | 150 |
一种 | 3 | 200 |
一种 | 3 | 400 |
我需要从 df B 获取 df A 值中的字母和 ID 的每个组合,然后运行异常值函数。
目前我正在使用超过 40,000 行的 A 和 4,500,000 的列表 b
a['Results'] = a.apply(lambda x: outliers(b[(b['Letter']==x['Letter']) & (b['ID']==x['ID'])]['value'].to_list()),axis=1)
正如你可以想象的那样,这将永远持续下去。我是否犯了一些错误或可以改进此代码的东西?
解决方案
我首先使用[Letter, ID]
in将每个组合聚合df_b
到一个列表中.groupby
,然后合并df_a
并应用您的outliers
函数。应该更快:
df_a["results"] = df_a.merge(
df_b.groupby(["Letter", "ID"])["Value"].agg(list),
left_on=["Letter", "ID"],
right_index=True,
how="left",
)["Value"].apply(outliers)
print(df_a)
推荐阅读
- python - 使用多处理池函数并行化 for 循环
- mysql - 带有 case 和 when 的高级 Mysql 查询
- javascript - 在动态加载的引导模式中触发 Wordpress 短代码
- unix - unix.Script 中的性能调优非常慢
- android - 我可以以编程方式从我的 GridView 制作可点击的项目吗?
- javascript - 抑制 css 样式
- python - 将python列表项逐行插入MySQL表
- swift - 如何检测用户是否在 Swift Firestore 中断开或关闭了应用程序?
- python - 在 django 模板中按键获取字典值
- android - 在 GridView 布局中的列之间绘制分隔符