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

CSV:如何在列表中找到下一个更大的值(python)?,python,pandas,list,csv,Python,Pandas,List,Csv,我有一个代码,可以读取CSV文件中的一列,并从给定列表中为列中的每个元素找到最佳匹配。共有3列:区域、数字和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

我有一个代码,可以读取CSV文件中的一列,并从给定列表中为列中的每个元素找到最佳匹配。共有3列:区域、数字和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')
它创建了第四列“建议的计划”,并根据代码从公共_列表中找到最佳匹配项。但我需要一个代码,将创建另一个(第5列),将有下一个更大的价值从列表中。例如,如果最佳匹配(第4列)是600,列表中下一个较大的值是650,我希望代码找到650并将其添加到该列中。列中的每个元素都是相同的。
提前感谢,各位

您可以更新
get\u plan()
函数,以同时返回所有列的结果

一旦确定了最佳结果,下一个最高值就是
公共列表中的下一个。可以用于提供列表中元组的索引

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


这是令人困惑的,请给出一个
公共列表的示例,它不在代码中(我们可以运行脚本)。其次,您的代码正在创建
建议计划
而不是
最佳匹配
@MartinEvans更新了问题。common_list是一个基本的数字列表[1000、1500、2000等等]。这个示例对每个调用都进行了新的排序,这似乎不是很理想。是否有任何方法可以创建新的列,现在该列将显示下一个更低的结果(几乎相同,但这次值更低,而不是更大)?效果非常好!你的想法是正确的,为此感谢了无数次。我可以问一下:我已经更新了代码,实际上,common_列表中的每个值都有名称(签入代码)。是否不仅记录了数值,而且还记录了相应的名称。例如:建议的计划(数字)、建议的计划(名称)、下一个更大的计划(数字)、下一个更大的计划(名称)、下一个更低的计划(数字)、下一个更低的计划(名称)。再次感谢!您需要使用文本名称(而不是变量名称),另外两个具有
1500
,因此
bsnsrsh15
始终需要precedent@MartinEvans那我怎么能实现呢?我做了一个与之相近的任务,我也搜索了最佳匹配,但使用了两个变量,并得到了一个我使用的名称:最佳匹配整体=min(公共列表,键=部分(距离平方,列表客户))名称最佳匹配整体=[k代表k,局部变量中的v().items()如果v==最佳匹配整体][0]。有什么办法可以实施吗?
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')