Python-根据范围转换列表中的值

Posted

技术标签:

【中文标题】Python-根据范围转换列表中的值【英文标题】:Python-Convert values in a list based on a range 【发布时间】:2022-01-14 11:22:41 【问题描述】:

我正在尝试根据范围转换熊猫数据框行中列表中的元素。例如,如果我有一行的值:["1","15","35"] 我想将其转换为:["1 - 9 lbs","10 - 19 lbs" ,"大于 30 磅"]

我有转换单个值的脚本,例如:[10],但它的单行中的多个值让我失望。如果有人可以提供帮助,我将不胜感激。我知道将列表作为价值并不是最好的,但这是我的工作所需要的。

我有什么:

metric='lbs'
range_string = """
1 - 9 lbs
10 - 19 lbs
20 - 29 lbs
Greater Than 30 lbs
 """

# range function builder
string = range_string.replace(metric, '')
lst = string.split('\n')
builder_base = f'''
def range_app(num):
'''
for val in lst:
    if val.find(' - ') >-1:
        original_val = val
        lower, upper = val.split(' - ')
        inner_f = f'''
    if num >= lower and num <= upper:
        return "original_valmetric"
        '''
        builder_base = builder_base + inner_f
    if val.find('Greater than ') >-1:
        original_val = val
        upper = val.replace('Greater than ','')
        inner_f = f'''
    if num >= upper:
        return "original_valmetric"
        '''
        builder_base = builder_base + inner_f
final_else = '''
    else:
        return r"n/a"
'''
exec(builder_base + final_else)
print( builder_base + final_else)


df = pd.DataFrame("A": [[16, 14.97, 22.75]])
df['A']=df['A'].astype(float)
df['A'] = df['A'].apply(range_app)

我需要什么:

df = pd.DataFrame("A": [["16","24.42"], ["14.97","16.06"], ["22.75","23"]])
df['A']=df['A'].astype(float)
df['A'] = df['A'].apply(range_app)

最终输出:

["10-19 lbs","20-29 lbs"]
["10-19 lbs","10-19 lbs"]
["20-29 lbs","20-29 lbs"]

【问题讨论】:

【参考方案1】:

试试这个。

import re

range_string = """
1 - 9 lbs
10 - 19 lbs
20 - 29 lbs
Greater Than 30 lbs
"""

range_params = 
for range_entry in range_string.split('\n'):
    range_nums = re.findall('\d+', range_entry)
    if len(range_nums) > 0: 
        range_params[tuple(map(int, range_nums))] = range_entry.strip()


def range_app(num_lst):
    updated_labels = []
    for num in num_lst:
        num = float(num)
        for range_param, range_label in range_params.items():
            if len(range_param) == 1:
                if num >= range_param[0]:
                    updated_labels.append(range_label)
            else:
                if num >= range_param[0] and num <= range_param[1]:
                    updated_labels.append(range_label)
    return updated_labels

另外,我不确定您的类型转换是否正确,因为“A”列的行的值是一个列表。

df = pd.DataFrame("A":  [["16","24.42"], ["14.97","16.06"], ["22.75","23"]])
df['A'] = df['A'].apply(range_app)

【讨论】:

这很完美!感谢您的解决方案。我必须把_____.apply(lambda x: remove_duplicates([n.strip() for n in ast.literal_eval(x)]))___放在___.apply(range_app)之前。我知道这很痛苦,但这就是我的公司想要的方式

以上是关于Python-根据范围转换列表中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何将嵌套字典列表与它们的值中的公共键相加? [复制]

如何在 Python 的列表值中添加特定字符?

根据字典中的键值检查列表中的值,Python

尝试从数组中的值中删除基于 MKMap 的引脚

如何使用熊猫根据列的值范围分离数据框?

Python将字典中的值转换为元组