0

0

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

DDD

DDD

发布时间:2025-11-07 13:09:33

|

931人浏览过

|

来源于php中文网

原创

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

羚珑
羚珑

京东推出的一站式AI图像处理平台

下载
  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开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

755

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

760

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1264

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

578

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 1.8万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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