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

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

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

序列猴子开放平台

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

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

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

  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()更直观和健壮的方式来判断字符串是否
上一篇
下一篇
text=ZqhQzanResources