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 文件