CSV:如何在列表中找到下一个更大的值(python)?

Posted

技术标签:

【中文标题】CSV:如何在列表中找到下一个更大的值(python)?【英文标题】:CSV: How to find next greater value in a list (python)? 【发布时间】:2021-08-26 05:44:37 【问题描述】:

我有一段代码可以读取 CSV 文件中的一列,并为给定列表中的一列中的每个元素找到最佳匹配。共有 3 列:ZONE、Numbers 和 ARPU。我们现在正在与 ARPU 合作。该列表称为(common_list),您将在代码中看到它

tp_usp15 = 1500
tp_usp23 = 2300
tp_usp27 = 2700
list_usp = [tp_usp15,tp_usp23, tp_usp27]

tp_bsnspls_s = 600
tp_bsnspls_steel = 1300
tp_bsnspls_chrome = 1800
list_bsnspls = [tp_bsnspls_s,tp_bsnspls_steel,tp_bsnspls_chrome

tp_bsnsrshn10 = 1000
tp_bsnsrshn15 = 1500
tp_bsnsrshn20 = 2000
list_bsnsrshn = [tp_bsnsrshn10,tp_bsnsrshn15,tp_bsnsrshn20]

common_list = list_usp + list_bsnspls + list_bsnsrshn

import pandas as pd

df = pd.read_csv('root of file.csv')

def get_plan(arpu):
    return min(common_list, key=lambda x:abs(x-float(arpu)))

df["Suggested plan"] = df["ARPU"].apply(get_plan)
df.to_csv('updated.csv')

它创建了名为“Suggested Plan”的第 4 列,并根据代码从 common_list 中找到 BEST MATCHES。但是我需要一个代码来创建另一个(第 5 列),该代码将具有列表中的 NEXT GREATER 值。例如,如果最佳匹配(第 4 列)是 600,而列表中下一个更大的值是 650,我希望代码找到 650 并将其添加到列中。列中的每个元素都相同。 提前谢谢各位了

【问题讨论】:

这很混乱,请edit这个问题举一个common_list的例子,它不在代码中(我们可以运行脚本)。其次,您的代码正在创建 Suggested plan 而不是 BEST MATCHES @MartinEvans 更新了问题。 common_list 是数字 [1000、1500、2000 等] 的基本列表。 【参考方案1】:

您可以更新您的 get_plan() 函数以同时返回所有列的结果。

一旦您确定了最佳结果,下一个最高的就是common_list 中的下一个。 bisect_left() 可用于为您提供列表中元组的索引。

如果已经在列表顶部,您可以再次返回最高值或None 表示没有更高的值。同样对于最低值,它是common_list 中的下一个较低值,或者如果最低值返回它,或者可能是None(根据需要):

import pandas as pd
from bisect import bisect_left

def get_plans(p):
    best = min(common_list, key=lambda x : abs(x[0] - p['ARPU']))
    best_index = bisect_left(common_list, best)        # get location of best in common_list
    
    if best_index < len(common_list) - 1:
        next_greater = common_list[best_index + 1]
    else:
        next_greater = best                     # already highest

    if best_index > 0:
        next_lower = common_list[best_index - 1]
    else:
        next_lower = best                       # already lowest

    return [*best, *next_greater, *next_lower]


common_list = sorted([
    (1500, "usp15"),
    (2300, "usp23"),
    (2700, "usp27"),
    
    (600,  "bsnspls_s"),
    (1300, "bsnspls_steel"),
    (1800, "bsnspls_chrome"),

    (1000, "bsnsrshn10"),
    (1500, "bsnsrshn15"),
    (2000, "bsnsrshn20"),
])

fields = ['Suggest plan', 'Name 1', 'Next greater', 'Name 2', 'Next lower', 'Name 3']

df = pd.read_csv('root of file.csv')
df[fields] = df.apply(get_plans, axis=1, result_type="expand")
df.to_csv('updated.csv')

这将给出:

   ZONE  Numbers  ARPU  Suggest plan         Name 1  Next greater      Name 2  Next lower          Name 3
0     0        5   600           600      bsnspls_s          1000  bsnsrshn10         600       bsnspls_s
1     1       10   300           600      bsnspls_s          1000  bsnsrshn10         600       bsnspls_s
2     2       20   400           600      bsnspls_s          1000  bsnsrshn10         600       bsnspls_s
3     2       30  1300          1300  bsnspls_steel          1500  bsnsrshn15        1000      bsnsrshn10
4     3       20  1400          1300  bsnspls_steel          1500  bsnsrshn15        1000      bsnsrshn10
5     3       20  1450          1500     bsnsrshn15          1500       usp15        1300   bsnspls_steel
6     3       20  1500          1500     bsnsrshn15          1500       usp15        1300   bsnspls_steel
7     4       20  2000          2000     bsnsrshn20          2300       usp23        1800  bsnspls_chrome
8     5       20     0           600      bsnspls_s          1000  bsnsrshn10         600       bsnspls_s

【讨论】:

这个例子对每次调用都进行了新的排序,这似乎不是很优化 有什么方法可以创建新的列,现在将显示下一个较低的结果(几乎相同,但这次值较低而不是更大)? 完美运行!你有正确的想法,并为此感谢数百万次。请问:我已经更新了代码,实际上,来自 common_list 的每个值都有名称(检查代码)。是否可能不仅记录了数值,还记录了相应的名称。例如:建议计划(数字)、建议计划(名称)、下一个更大(数字)、下一个更大(名称)、下一个较低(数字)、下一个较低(名称)。再次,非常感谢! 您需要使用文本名称(不是变量名称),还有两个有 1500 所以bsnsrsh15 总是优先使用 @MartinEvans 那么我该如何实现呢?我完成了一项密切的任务,在那里我还搜索了最佳匹配,但通过 2 个变量并获得了我使用的名称: best_match_overall = min(common_list, key=partial(distance_squared, list_client)) name_best_match_overall = [k for k,v in locals( ).items() 如果 v == best_match_overall][0]。任何想法如何实现它?

以上是关于CSV:如何在列表中找到下一个更大的值(python)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 和 Pandas 创建比 RAM 更大的 csv 文件

496.下一个更大的元素I

496-下一个更大元素 Ⅰ

leetcode.496. 下一个更大元素 I

CHCSVWriter用于写入更大的CSV文件的内存使用情况

下一个更大元素 I(LeetCode 496)