python - pandas 根据匹配记录的有序列表的 TOP 1 结果连接数据帧

标签 python pandas dataframe

我有一个数据框,其中包含所有可供出售的选项:

options = pd.DataFrame({'Name':['a', 'b', 'c', 'd'],
                  'Price':[1,3,6,4], 
                  'Size':[12,32,44,68], 
                  'Content':[10,8,22,20]} 

以及需求列表:

criteria = pd.DataFrame({'Customer':['a1', 'b2', 'c3', 'd4'],
                  'MinSize':[8,20,12,40], 
                  'MinContent':[18,6,21,4]}

我需要从满足最低标准的选项中获取最低价格,结果是:

pd.DataFrame({'Customer':['a1', 'b2', 'c3', 'd4'],
                  'MinSize':[8,20,12,40], 
                  'MinContent':[18,6,21,4],
                  'MatchingOption':['d','b','c','d']}

这相当于 SQL 中的 TOP 1 WHERE Con​​tent >= MinContent AND Size >= MinSize ORDER BY Price ASC

如何根据匹配记录的有序列表的 TOP 1 结果连接数据框?

最佳答案

对于criteria中的每一行,过滤掉Size>=MinSizeContent>=MinContentoptions >,然后对 Price 列进行排序并获取 Name 的第一个值,将结果系列分配回标准数据帧的新列:

result=(criteria.assign(MatchingOption=criteria
                 .apply(lambda x: 
                        options[(options['Size'].ge(x['MinSize']))
                        & (options['Content'].ge(x['MinContent']))]
                        .sort_values('Price').iloc[0]['Name'],
                        axis=1))
 )

输出:

  Customer  MinSize  MinContent MatchingOption
0       a1        8          18              d
1       b2       20           6              b
2       c3       12          21              c
3       d4       40           4              d

关于python - pandas 根据匹配记录的有序列表的 TOP 1 结果连接数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68731462/

相关文章:

python - 如何在继承 wx.Frame 的类之外的类中创建 staticBitmap

python - 值错误: array must not contain infs or NaNs during Biclustering

python - pandas isin() 返回与 eq() 不同的结果 - float dtype 依赖问题

python - 使用 groupby 方法获取数据帧的完整日期时间索引(以毫秒为单位)

python - 如何使用 pandas 列中以前的 N 值来填充 NaN?

python - 用于比较稀疏向量的 Pyspark UDF

Python 脚本循环遍历文件并通过请求调用 api,然后将结果存储到文本文件

python - 访问 SQLAlchemy 的外键项

python - pandas group by,在输入列上使用多个 agg 函数进行聚合

mysql - 检查 R 中列中的空值或 na 值