Python-根据范围转换列表中的值
Python-Convert values in a list based on a range
我正在尝试根据范围转换 pandas 数据框行中列表中的元素。一个例子是,如果我有一行值:["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_val}{metric}"
'''
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_val}{metric}"
'''
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"]
试试这个。
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)
我正在尝试根据范围转换 pandas 数据框行中列表中的元素。一个例子是,如果我有一行值:["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_val}{metric}"
'''
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_val}{metric}"
'''
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"]
试试这个。
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)