Python数据处理:规范化带单位字符串与缺失值的列表数据

DDD
发布: 2025-11-07 13:09:33
原创
903人浏览过

Python数据处理:规范化带单位字符串与缺失值的列表数据

本教程旨在指导如何高效处理包含混合数据类型的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免费学习笔记(深入)”;

序列猴子开放平台
序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0
查看详情 序列猴子开放平台
  1. 不正确的循环结构: 例如,使用while len(damage) > len(damage_update)结合for damage in damages。这种结构是冗余且容易出错的。for循环已经能够遍历列表的所有元素,while循环在这里是不必要的,并且变量名damage在while条件中可能与for循环中的元素混淆。正确的做法是直接使用for循环遍历原始列表。

  2. 字符串与列表方法的混淆:damages.find(M):find()是字符串方法,用于查找子字符串。在这里,damages是一个列表,不能直接调用find()。我们应该对列表中的每个元素(即单个字符串)调用字符串方法。此外,M应该作为字符串字面量'M'使用。 damages.update():Python的列表类型并没有名为update()的方法。如果目的是修改列表元素,通常是直接通过索引赋值,或者在构建新列表时添加转换后的元素。对于字符串,也没有update()方法来直接替换部分内容。

  3. elif条件缺失:elif : 后面必须跟随一个条件表达式。一个空的elif会导致语法错误。

  4. 循环内打印: 在循环的每次迭代中打印整个结果列表print(damage_update),会导致大量重复输出,通常我们只关心最终的结果。

正确的数据转换策略

要正确实现数据转换,我们需要遵循以下步骤:

  1. 封装为函数: 将转换逻辑封装在一个函数中,提高代码的模块化和复用性。
  2. 遍历原始列表: 使用for循环逐个处理列表中的每个元素。
  3. 条件判断:
    • 如果元素是“Damages not recorded”,则直接添加到新列表。
    • 如果元素以'M'结尾,则去除'M',转换为浮点数,并乘以1,000,000。
    • 如果元素以'B'结尾,则去除'B',转换为浮点数,并乘以1,000,000,000。
    • 处理其他未知格式(可选,通常是抛出错误或记录)。
  4. 构建新列表: 将转换后的值添加到新的列表中。
  5. 返回新列表: 函数返回处理后的新列表。

示例代码:实现数据转换函数

下面是一个实现上述策略的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)")
登录后复制

代码解析:

  • update_damage_data(damages_list): 定义了一个接受一个列表作为参数的函数。
  • updated_damages = []: 初始化一个空列表来存储转换后的数据。
  • for item in damages_list:: 遍历输入列表中的每一个元素。
  • item == 'Damages not recorded': 精确匹配缺失值字符串。
  • item.endswith('M') 和 item.endswith('B'): 使用字符串的endswith()方法检查后缀,这是比find()更直观和健壮的方式来判断字符串是否

以上就是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号