我有两只Pandas DataFrame, struct 相同.数据帧B是数据帧A的子集.

我要筛选DataFrame B,只有当价格值出现在DataFrame A,or it is within 1% of a value in DataFrame A中时.

例如,即使不存在确切的价格,如果A中有一行的价格为+/-1%,我也希望保持该值.

数据帧A:

index  price
    0  20.23
    1  10.34
    2  5.28
    3  12.25
    4  12.32

数据帧B:

index  price
    0  0.23
    1  10.34
    2  5.26

过滤所需的结果:

index  price
    0  10.34
    1  5.26
import pandas as pd

dfA = pd.DataFrame({'index': [0, 1, 2, 3, 4],
        'price': [20.23, 10.34, 5.28, 12.25, 12.32]})

dfB = pd.DataFrame({'index': [0, 1, 2],
        'price': [0.23, 10.34, 5.26]})

下面的内容只会给我提供完全匹配的信息.

dfB[dfB['price'].isin(dfA['price'])]

推荐答案

下面是另一个例子,使用.merge_asof(注意:dfAdfB需要按price排序):

dfA = dfA.sort_values("price")
dfB = dfB.sort_values("price")

x = pd.merge_asof(dfB, dfA, on="price", direction="nearest")

创建x个:

   index_x  price  index_y
0        0   0.23        2
1        2   5.26        2
2        1  10.34        1

然后计算百分比差值:

x["diff"] = np.abs(x["price"] - dfA.loc[x["index_y"], "price"].values)
print(x[x["diff"] <= (x["price"] / 100)])

打印:

   index_x  price  index_y  diff
1        2   5.26        2  0.02
2        1  10.34        1  0.00

完整的代码如下:

dfA = dfA.sort_values("price")
dfB = dfB.sort_values("price")

x = pd.merge_asof(dfB, dfA, on="price", direction="nearest")
x["diff"] = np.abs(x["price"] - dfA.loc[x["index_y"], "price"].values)
x = x[x["diff"] <= (x["price"] / 100)]

x = x[["index_x", "price"]].set_index("index_x").rename_axis(index=None).sort_index()
print(x)

打印:

   price
1  10.34
2   5.26

Python相关问答推荐

将词典写入Excel

"如果发生特定错误,返回值

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

如何自动抓取以下CSV

删除所有列值,但判断是否存在任何二元组

为什么这个带有List输入的简单numba函数这么慢

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

对所有子图应用相同的轴格式

如何使用表达式将字符串解压缩到Polars DataFrame中的多个列中?

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

joblib:无法从父目录的另一个子文件夹加载转储模型

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

Python列表不会在条件while循环中正确随机化'

如何指定列数据类型

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

如何在Pyplot表中舍入值

如何排除prefecture_related中查询集为空的实例?

在代码执行后关闭ChromeDriver窗口

OpenGL仅渲染第二个三角形,第一个三角形不可见

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "