python数据清洗数据单位归一化

使用python进行数据清洗时,有一列数据单位不统一,该怎么将数据单位化统一,部分数据如下:4.5-6千
1-1.5万
0.8-1万
1.2-2.4万
1-2万
1-1.5万
1.2-2.3万
7.5千-1.5万·13薪
1-1.5万·13薪

根据你提供的数据,可以看出这一列中的数据,数据单位不统一、 数据存在范围不一。
为了将这些数据单位化,需要分离出最小值 和 最大值 两列可以用 .split('-') 来分离数据。根据单位,给出相应的系数如千:1000 ; 万:10000 ; 薪:10000/13。将所有数据乘以相应的系数,转换为同一个单位(比如元);合并单位化后的最小值和最大值,生成新的数据列

import pandas as pd

df = pd.read_csv('data.csv')
df['range'] = df['col'].str.split('-')
df['min'] = df['range'].str[0] 
df['max'] = df['range'].str[1]

# 根据单位给出系数
df['factor'] = np.where(df['min'].str.contains('千'), 1000,  
                         np.where(df['min'].str.contains('万'), 10000, 10000/13))

# 乘以系数        
df['min'] = df['min'].str[:-1].astype(float) * df['factor']  
df['max']  = df['max'].str[:-1].astype(float) * df['factor']

# 合并单位化后的数据   
df['col'] = df['min'].astype(str) + '-' + df['max'].astype(str)

# 删除中间字段 
df.drop(['range', 'min', 'max', 'factor'], axis=1, inplace=True)

如有帮助,请点个采纳~


import re

def normalize_data_units(data):
    unit_mapping = {
        '千': 0.1,
        '万': 1.0,
    }

    normalized_data = []

    for entry in data:
        match = re.search(r'([\d.]+)-([\d.]+)(\D*?)([·\d薪]*)$', entry)
        if match:
            start_value = float(match.group(1))
            end_value = float(match.group(2))
            unit = match.group(3)
            extras = match.group(4)

            if unit in unit_mapping:
                unit_multiplier = unit_mapping[unit]
                start_value *= unit_multiplier
                end_value *= unit_multiplier

            normalized_data.append(f"{start_value}-{end_value}{extras}")

    return normalized_data

data = [
    '4.5-6千',
    '1-1.5万',
    '0.8-1万',
    '1.2-2.4万',
    '1-2万',
    '1-1.5万',
    '1.2-2.3万',
    '7.5千-1.5万·13薪',
    '1-1.5万·13薪'
]

normalized_data = normalize_data_units(data)
print(normalized_data)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7719065
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Python进阶之路 5.2.5 字段宽度、精度和千位分隔符
  • 同时,你还可以查看手册:python- 定义扩展类型:已分类主题- 终结和内存释放 中的内容
  • 除此之外, 这篇博客: python基础练习题中的 题目十四:创建一个20行5列的二维数组,其值范围为0~9(需为整数),在其所有的值中随机抽取20个位置进行修改,修改后的值为100,如图所示: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    思路分析:导入numpy模块创建二维数组,范围为0~9的随机数,接下来用for语句循环十次,行数与列数随机抽取组成二维数组坐标,该坐标上的数替换成100

    代码解析:

    mport numpy as np
    import random
    nd = np.random.randint(0, 9, size=[20, 5])
    i = 1
    for i in range(10):
        x = random.randint(0, 19)
        y = random.randint(0, 4)
        nd[x][y] = 100
    print(nd)
    
  • 您还可以看一下 甘论清老师的Python编程系列教程之一基础篇课程中的 1-37 正则-4小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    确切地说,给出的参考资料与问题描述之间存在不匹配。参考资料中给出了有关随机森林分类模型的一些代码,与问题描述的数据清洗无直接关系。因此,我无法根据参考资料中的代码来解决数据单位归一化的问题。以下是我尝试解决该问题的具体步骤:

    步骤1: 数据预处理

    首先,你需要导入所需的库并读取数据。根据问题描述,数据中的某一列存在不统一的单位。因此,你需要将这一列拆分成两个独立的列:最小值和最大值。

    以下是一个示例代码,用于读取数据并拆分单位列:

    import pandas as pd
    
    # 读取数据
    data = pd.read_csv('data.csv')
    
    # 拆分单位列
    data[['min_value', 'max_value']] = data['unit_column'].str.split('-', expand=True)
    

    步骤2: 单位统一化

    接下来,你需要将单位统一化为相同的表示形式。在本例中,单位包括"千"和"万"。你可以将"千"表示为1000,将"万"表示为10000。

    以下是一个示例代码,用于单位统一化:

    # 单位统一化
    data['min_value'] = data['min_value'].replace('\d+千', lambda m: str(int(m.group(0).replace('千', '')) * 1000))
    data['min_value'] = data['min_value'].replace('\d+万', lambda m: str(int(m.group(0).replace('万', '')) * 10000))
    
    data['max_value'] = data['max_value'].replace('\d+千', lambda m: str(int(m.group(0).replace('千', '')) * 1000))
    data['max_value'] = data['max_value'].replace('\d+万', lambda m: str(int(m.group(0).replace('万', '')) * 10000))
    

    步骤3: 数据类型转换

    最后,你可能需要将"min_value"和"max_value"列的数据类型转换为数值类型,以便后续分析和处理。

    以下是一个示例代码,用于数据类型转换:

    # 数据类型转换
    data['min_value'] = pd.to_numeric(data['min_value'])
    data['max_value'] = pd.to_numeric(data['max_value'])
    

    完成了以上步骤后,你可以验证数据的单位是否已经统一化。你可以通过打印出数据的前几行或使用描述性统计方法来进行验证。

    # 打印统一化后的数据
    print(data.head())
    
    # 描述性统计
    print(data.describe())
    

    希望这些步骤可以帮助你解决数据单位归一化的问题。如果有任何疑问,请随时追问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^