python - 根据近似匹配或公式在熊猫中查找重复行
问题描述
我有一个熊猫数据框
import pandas as pd
df = pd.DataFrame({"x" : [1.,1.,2.,3.,3.01,4.,5.],"y":[10.,11.,12.,12.95,13.0,11.,10.],
"name":["0ndx","1ndx","2ndx","3ndx","4ndx","5ndx","6ndx"]})
print(df.duplicated(subset=["x","y"]))
x y name
0 1.00 10.00 0ndx
1 1.00 11.00 1ndx
2 2.00 12.00 2ndx
3 3.00 12.95 3ndx
4 3.01 13.00 4ndx
5 4.00 11.00 5ndx
6 5.00 10.00 6ndx
我想使用基于距离的公式查找重复的行(在本例中为第 3 行和第 4 行),公差为 0.1。如果一行与另一行的距离在 0.1 以内(或者,等效地,如果 x 和 y 都在公差范围内),则该行将被复制。正如一位评论者指出的那样,这可能导致一组值的价差超过 0.1,因为 1.1 接近 1.18 接近 1.22。这可能会影响您可以做的一些事情,但我仍然会将在另一个允许范围内的任何行定义为重复。
这是一个玩具问题我有一个中等大小的问题,但预见到足够大(250,000 行)的问题,外部产品的构建可能很昂贵。
有没有办法做到这一点?
解决方案
您可以与 pandas.shift https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shift.html进行比较。
然后,如果您想将每一行与前一行进行比较,并在它们彼此之间的某个阈值范围内创建一列,假设 0.1 它将遵循:
eps = 0.1
df['duplicated'] = 0
df.sort_values(by=['x'],inplace=True)
df.loc[abs(df['x'] - df['x'].shift()) <= eps,'duplicated'] = 1
那么带有 1 的列将是那些在您的阈值内重复的列。
推荐阅读
- javascript - running functions synchronously in firebase
- python - 如何使用 raspberry pi 和 python 扫描路由器的 RSSI 并根据值对它们进行排序?
- php - 检查两条路线(以纬度和经度表示)是否彼此相对
- angular - Angular 6 set 属性全局动态生成组件
- sql - How to declare a number variable where I can save th count of table in my loop
- c# - TFS 2018 Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException:找不到页面
- acumatica - Acumatica REST API - StockItem - 如何在请求中使用具有特定产品 ID 的多个产品 ID
- java - 如何测试 Java 类是线程安全的?
- javascript - 交换变量的硬编码参数
- node.js - NodeJS + mongoose - 全局用户动态数据库