Python数据处理:将带有单位的字符串数值转换为浮点数

花韻仙語
发布: 2025-11-07 12:51:06
原创
670人浏览过

python数据处理:将带有单位的字符串数值转换为浮点数

本教程详细介绍了如何使用Python将包含单位(如'M'和'B')的字符串数值列表转换为浮点数,并妥善处理缺失数据。文章涵盖了函数封装、字符串分割与类型转换、条件判断等核心技术,并纠正了常见的编程错误,旨在帮助读者高效、准确地清洗和转换数据。

在数据处理中,我们经常会遇到需要将非标准格式的字符串数值转换为可计算的数值类型(如浮点数)的场景。例如,一个包含财务损失数据的列表可能混合了带有“M”(百万)或“B”(十亿)单位的字符串,以及表示缺失值的特定文本。本教程将指导您如何高效、准确地完成此类数据转换任务。

原始数据示例

假设我们有以下一个存储损失数据的列表:

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免费学习笔记(深入)”;

常见问题与编程陷阱分析

在尝试解决此类问题时,初学者可能会遇到一些常见的编程陷阱,导致代码无法按预期工作或报错。以下是一些典型的错误点:

  1. 不正确的循环结构: 使用 while len(damage) > len(damage_update) 配合 for damage in damages 这样的嵌套循环是冗余且容易出错的。对于遍历列表并基于每个元素生成新列表的任务,一个简单的 for 循环通常是最佳选择。
  2. 误用字符串或列表方法: 字符串和列表都没有名为 update() 的方法来直接修改其内容或元素。字符串是不可变的,而列表元素的修改通常通过索引赋值或构建新列表来完成。尝试 damages.update() 会导致 AttributeError。
  3. 条件语句不完整: elif 语句必须紧跟一个条件表达式。例如,elif : damages.find(B): 是一个语法错误,缺少 elif 后面的条件。
  4. 字符串查找方法: find() 方法在字符串中查找子字符串,如果找到返回其起始索引,否则返回 -1。更Pythonic和简洁的方式是使用 in 运算符来检查子字符串是否存在。

解决方案:构建高效的数据转换函数

为了解决上述问题并实现数据转换,我们将创建一个函数,它接收原始数据列表作为输入,并返回一个包含转换后数值的新列表。

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44
查看详情 怪兽AI数字人

1. 函数封装与初始化

首先,将所有逻辑封装在一个函数中,这有助于代码的模块化、可读性和重用性。在函数内部,初始化一个空列表来存储转换后的数据。

def update_damages(damages_list):
    """
    将包含单位('M'/'B')的字符串损失数据转换为浮点数,
    并保留缺失数据标识。

    参数:
    damages_list (list): 包含字符串形式损失数据的列表。

    返回:
    list: 包含转换后浮点数和缺失数据标识的新列表。
    """
    damage_update = [] # 用于存储转换后数据的新列表
    # ... 转换逻辑将在此处添加
    return damage_update
登录后复制

2. 遍历数据并应用转换逻辑

使用 for 循环遍历 damages_list 中的每一个元素,并根据其内容应用不同的转换规则。

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 'M' in damage_item:
            # 如果包含 'M' (百万)
            # 1. 使用 split('M')[0] 获取数值部分
            # 2. 转换为浮点数
            # 3. 乘以 1,000,000
            value = float(damage_item.split('M')[0]) * 1_000_000
            damage_update.append(value)
        elif 'B' in damage_item:
            # 如果包含 'B' (十亿)
            # 1. 使用 split('B')[0] 获取数值部分
            # 2. 转换为浮点数
            # 3. 乘以 1,000,000,000
            value = float(damage_item.split('B')[0]) * 1_000_000_000
            damage_update.append(value)
        else:
            # 处理其他未知或非标准格式的情况,这里假设所有其他都是数值
            # 如果有其他复杂情况,需要进一步的条件判断
            try:
                damage_update.append(float(damage_item))
            except ValueError:
                # 如果无法转换为浮点数,可以根据需求处理,例如保留原样或标记为NaN
                damage_update.append(f"Unrecognized format: {damage_item}")
    return damage_update
登录后复制

代码解析:

  • for damage_item in damages_list::这是一个标准的Python循环,用于依次取出列表中的每个元素。
  • if damage_item == 'Damages not recorded'::直接判断元素是否为缺失值标识。
  • elif 'M' in damage_item::使用 in 运算符检查字符串中是否包含 'M'。
  • damage_item.split('M')[0]:split('M') 会将字符串在 'M' 处分割成一个列表。例如,"100M" 会变成 ['100', '']。我们取第一个元素 [0],即 "100"。
  • float(...):将提取出的字符串数值转换为浮点数。
  • * 1_000_000:将数值乘以一百万,完成单位转换。Python 3.6+ 支持使用下划线 _ 作为数字分隔符,提高可读性。
  • damage_update.append(value):将转换后的数值添加到 damage_update 列表中。

3. 完整代码示例与测试

将所有部分组合起来,并用原始数据进行测试:

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_list (list): 包含字符串形式损失数据的列表。

    返回:
    list: 包含转换后浮点数和缺失数据标识的新列表。
    """
    damage_update = []
    for damage_item in damages_list:
        if damage_item == 'Damages not recorded':
            damage_update.append(damage_item)
        elif 'M' in damage_item:
            value = float(damage_item.split('M')[0]) * 1_000_000
            damage_update.append(value)
        elif 'B' in damage_item:
            value = float(damage_item.split('B')[0]) * 1_000_000_000
            damage_update.append(value)
        else:
            # 如果有其他纯数字字符串,也可以尝试转换为浮点数
            try:
                damage_update.append(float(damage_item))
            except ValueError:
                # 对于无法识别的格式,可以选择保留原样或抛出错误
                damage_update.append(f"Unrecognized format: {damage_item}")
    return damage_update

# 调用函数并打印结果
updated_damages = update_damages(damages)
for item in updated_damages:
    print(item)
登录后复制

运行上述代码,您将看到一个包含浮点数和字符串“Damages not recorded”的混合列表,所有带单位的数值都已正确转换为其浮点形式。

总结与注意事项

  • 函数封装: 始终建议将逻辑封装在函数中,以提高代码的可维护性和可重用性。
  • 选择正确的循环: 对于遍历列表并基于每个元素生成新列表的任务,for 循环是首选。
  • 理解数据类型与方法: 明确字符串和列表各自支持的方法。不要混淆使用,例如 list.update() 或 str.update() 在此场景下是不存在的。
  • 字符串操作: in 运算符是检查子字符串是否存在的高效方式,split() 方法是分割字符串的强大工具
  • 类型转换: 使用 float() 函数将字符串转换为浮点数。在进行类型转换时,考虑使用 try-except 块来处理潜在的 ValueError,以增加代码的健壮性。
  • 构建新列表: 在数据转换过程中,通常推荐构建一个新列表来存储结果,而不是尝试原地修改原始列表,这有助于保持原始数据的完整性并避免意外的副作用。

通过遵循这些原则和方法,您可以有效地处理各种复杂的数据清洗和转换任务。

以上就是Python数据处理:将带有单位的字符串数值转换为浮点数的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号