
本教程旨在指导如何高效处理包含混合数据类型的python列表,特别是将带有'm'(百万)或'b'(十亿)单位的损害数据字符串转换为标准浮点数值,并妥善保留"damages not recorded"等缺失数据标识。文章将详细解析常见编程误区,并提供一个结构清晰、易于理解的python函数来实现这一数据清洗与转换过程。
在数据分析和处理的场景中,我们经常会遇到需要对原始数据进行清洗和规范化的任务。一个典型的例子是处理包含数值和单位的字符串,如“100M”代表100百万,或者“1.42B”代表1.42十亿,同时还需要处理明确标记的缺失值。本教程将以一个具体的Python列表为例,详细讲解如何编写一个健壮的函数来完成这类数据转换。
假设我们有以下一个损害数据列表,其中包含字符串形式的数值(带'M'或'B'后缀)以及表示缺失数据的字符串“Damages not recorded”:
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'的数值转换为对应的浮点数(例如,'100M'变为100,000,000.0,'1.42B'变为1,420,000,000.0),并保持“Damages not recorded”字符串不变。
在尝试解决此类问题时,初学者可能会遇到一些常见的逻辑和语法错误。理解这些误区有助于我们编写更正确的代码。
立即学习“Python免费学习笔记(深入)”;
不正确的循环结构: 例如,使用while len(damage) > len(damage_update)结合for damage in damages。这种结构是冗余且容易出错的。for循环已经能够遍历列表的所有元素,while循环在这里是不必要的,并且变量名damage在while条件中可能与for循环中的元素混淆。正确的做法是直接使用for循环遍历原始列表。
字符串与列表方法的混淆:damages.find(M):find()是字符串方法,用于查找子字符串。在这里,damages是一个列表,不能直接调用find()。我们应该对列表中的每个元素(即单个字符串)调用字符串方法。此外,M应该作为字符串字面量'M'使用。 damages.update():Python的列表类型并没有名为update()的方法。如果目的是修改列表元素,通常是直接通过索引赋值,或者在构建新列表时添加转换后的元素。对于字符串,也没有update()方法来直接替换部分内容。
elif条件缺失:elif : 后面必须跟随一个条件表达式。一个空的elif会导致语法错误。
循环内打印: 在循环的每次迭代中打印整个结果列表print(damage_update),会导致大量重复输出,通常我们只关心最终的结果。
要正确实现数据转换,我们需要遵循以下步骤:
下面是一个实现上述策略的Python函数:
def update_damage_data(damages_list):
"""
将包含带'M'/'B'单位的损害数据字符串转换为浮点数,
并保留“Damages not recorded”标识。
参数:
damages_list (list): 包含损害数据字符串的列表。
返回:
list: 转换后的浮点数列表,缺失值保持为字符串。
"""
updated_damages = []
for item in damages_list:
if item == 'Damages not recorded':
updated_damages.append(item)
elif item.endswith('M'):
# 移除'M',转换为浮点数,然后乘以100万
value_str = item.replace('M', '')
try:
value_float = float(value_str) * 1_000_000
updated_damages.append(value_float)
except ValueError:
# 处理转换失败的情况,例如 'abcM'
print(f"警告: 无法将 '{item}' 转换为数值,保留原始字符串。")
updated_damages.append(item)
elif item.endswith('B'):
# 移除'B',转换为浮点数,然后乘以10亿
value_str = item.replace('B', '')
try:
value_float = float(value_str) * 1_000_000_000
updated_damages.append(value_float)
except ValueError:
# 处理转换失败的情况,例如 'xyzB'
print(f"警告: 无法将 '{item}' 转换为数值,保留原始字符串。")
updated_damages.append(item)
else:
# 处理不符合已知格式的其他字符串
print(f"警告: 未知格式的损害数据 '{item}',保留原始字符串。")
updated_damages.append(item)
return updated_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']
# 调用函数并打印结果
processed_damages = update_damage_data(damages)
print(processed_damages)
# 验证部分结果
print(f"\n原始列表长度: {len(damages)}")
print(f"处理后列表长度: {len(processed_damages)}")
print(f"第一个非缺失值转换: {processed_damages[1]} (期望: 100000000.0)")
print(f"第一个B单位转换: {processed_damages[13]} (期望: 1420000000.0)")代码解析:
以上就是Python数据处理:规范化带单位字符串与缺失值的列表数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号