
本教程旨在指导如何在python中高效处理包含数字、单位(如“m”表示百万,“b”表示十亿)以及特定文本(如“damages not recorded”)的字符串列表。我们将详细解析常见的编码误区,并提供一套清晰、专业的解决方案,演示如何将这些混合数据类型转换为统一的浮点数值格式,同时保留非数值信息,确保数据的准确性和可用性。
在数据处理中,我们经常会遇到包含混合数据类型的字符串列表。例如,一个列表可能包含表示金额的字符串,这些金额带有单位(如“100M”表示1亿,“1.42B”表示14.2亿),也可能包含特殊的文本标记(如“Damages not recorded”)。将这类数据转换为统一的数值格式,同时妥善处理非数值部分,是数据清洗的关键一步。
本教程将以一个具体的示例数据 damages 列表为例,展示如何将其中的金额字符串转换为浮点数,并将非数值标记保留下来。
damages = ['Damages not recorded', '100M', 'Damages not recorded', '40M', '27.9M', '5M', 'Damages not recorded', '306M', '2M', '65.8M', '326M', '60.3M', '208M', '1.42B', '25.4M', 'Damages not recorded', '1.54B', '1.24B', '7.1B', '10B', '26.5B', '6.2B', '5.37B', '23.3B', '1.01B', '125B', '12B', '29.4B', '1.76B', '720M', '15.1B', '64.8B', '91.6B', '25.1B']
我们的目标是生成一个新的列表,其中所有以“M”或“B”结尾的字符串都被转换为相应的浮点数值,而“Damages not recorded”则保持不变。
在尝试解决此类问题时,初学者常会遇到一些逻辑和语法上的错误。以下是一个典型的错误尝试及其分析:
立即学习“Python免费学习笔记(深入)”;
damage_update = []
while len(damage) > len(damage_update): # 错误1: damage未定义,且循环条件不合理
for damage in damages: # 错误2: 在while循环内重复遍历,导致无限循环或逻辑错误
if damages.find(M): # 错误3: damages是列表,没有find方法;M未定义,应为字符串字面量
damage_update.append(damages.update(1000000,0)) # 错误4: damages是列表,没有update方法;参数不正确
elif : # 错误5: elif后缺少条件
damages.find(B): # 错误6: 同错误3
damage_update.append(damages.update(1000000000,0)) # 错误7: 同错误4
else:
damage_update.append(damages.update("Damages not recorded")) # 错误8: 同错误4
print(damage_update) # 错误9: 在循环内频繁打印,输出冗余
print(damage_update)错误分析要点:
为了实现目标,我们需要一个结构清晰、逻辑严谨的函数。以下是构建该函数的步骤和代码实现。
首先,将所有转换逻辑封装在一个函数中,这有助于代码的模块化和复用性。函数将接收原始的 damages 列表作为参数,并返回一个新的已处理的列表。
def update_damages(damages_list):
damage_update = []
# 转换逻辑将在此处实现
return damage_update使用一个 for 循环迭代 damages_list 中的每一个元素。在每次迭代中,我们将检查当前元素并根据其内容进行相应的转换。
def update_damages(damages_list):
damage_update = []
for damage_item in damages_list: # 遍历列表中的每一个损害记录
# 处理 damage_item
pass # 占位符
return damage_update对于每个 damage_item,我们需要执行以下判断:
我们可以使用字符串的 endswith() 方法来检查单位,以及 replace() 或 split() 方法来提取数值部分。
def update_damages(damages_list):
damage_update = []
for damage_item in damages_list:
if damage_item == 'Damages not recorded':
damage_update.append(damage_item)
elif damage_item.endswith('M'):
# 去除 'M',转换为浮点数,然后乘以 1,000,000
value_str = damage_item.replace('M', '')
try:
value_float = float(value_str) * 1_000_000 # 使用下划线增加数字可读性
damage_update.append(value_float)
except ValueError:
# 处理转换失败的情况,例如 'XM' 但 X 不是有效数字
damage_update.append(f"Invalid M value: {damage_item}")
elif damage_item.endswith('B'):
# 去除 'B',转换为浮点数,然后乘以 1,000,000,000
value_str = damage_item.replace('B', '')
try:
value_float = float(value_str) * 1_000_000_000
damage_update.append(value_float)
except ValueError:
# 处理转换失败的情况
damage_update.append(f"Invalid B value: {damage_item}")
else:
# 处理其他未知格式的字符串
damage_update.append(f"Unrecognized format: {damage_item}")
return damage_update将上述逻辑整合,并使用提供的 damages 数据进行测试:
damages = ['Damages not recorded', '100M', 'Damages not recorded', '40M', '27.9M', '5M', 'Damages not recorded', '306M', '2M', '65.8M', '326M', '60.3M', '208M', '1.42B', '25.4M', 'Damages not recorded', '1.54B', '1.24B', '7.1B', '10B', '26.5B', '6.2B', '5.37B', '23.3B', '1.01B', '125B', '12B', '29.4B', '1.76B', '720M', '15.1B', '64.8B', '91.6B', '25.1B']
def update_damages(damages_list):
"""
将包含M/B单位的损害字符串转换为浮点数,
并保留'Damages not recorded'字符串。
"""
damage_update = []
for damage_item in damages_list:
if damage_item == 'Damages not recorded':
damage_update.append(damage_item)
elif damage_item.endswith('M'):
# 处理以'M'结尾的字符串 (百万)
value_str = damage_item.replace('M', '')
try:
value_float = float(value_str) * 1_000_000
damage_update.append(value_float)
except ValueError:
print(f"警告: 无法将 '{damage_item}' 转换为浮点数。保留原始字符串。")
damage_update.append(damage_item)
elif damage_item.endswith('B'):
# 处理以'B'结尾的字符串 (十亿)
value_str = damage_item.replace('B', '')
try:
value_float = float(value_str) * 1_000_000_000
damage_update.append(value_float)
except ValueError:
print(f"警告: 无法将 '{damage_item}' 转换为浮点数。保留原始字符串。")
damage_update.append(damage_item)
else:
# 处理既不是特定字符串也不带M/B单位的其他格式
print(f"警告: 发现未知格式 '{damage_item}'。保留原始字符串。")
damage_update.append(damage_item)
return damage_update
# 调用函数并打印结果
processed_damages = update_damages(damages)
for item in processed_damages:
print(item)
# 打印前几个元素和总长度以验证
# print(processed_damages[:10])
# print(len(processed_damages))通过本教程,我们学习了如何处理包含混合数据类型的字符串列表,特别是如何将带有单位(M、B)的字符串转换为浮点数值,同时保留特定的文本标记。我们分析了常见的编程错误,并提供了一个健壮、高效的Python解决方案,该方案利用了函数封装、条件判断、字符串方法和错误处理机制。掌握这些技巧将有助于您在数据清洗和预处理任务中更加得心应手。
以上就是Python中带单位字符串列表的数值提取与转换教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号