
在pandas数据分析中,当包含数值和单位的列被错误识别为“对象”类型时,直接计算均值等统计量会受阻。本教程详细介绍了如何通过系统性的数据清洗和类型转换,将这些“对象”列精确地转换为数值类型,从而实现准确的描述性统计分析,包括处理缺失值、单位转换、分隔符统一及异常值处理,最终计算出有效的统计指标。
在数据预处理阶段,我们经常会遇到Pandas DataFrame中某些本应是数值型的列被错误地识别为object(对象)类型的情况。这通常是由于数据中混杂了文本(如单位、描述性文字)、特殊字符(如逗号作为小数点)、空格或多种数据格式。当这些列被标记为object类型时,我们无法直接使用mean()、median()等数值统计函数来计算它们的中心趋势度量。本教程将指导您如何识别这类问题,并提供一套系统性的方法来清洗和转换这些object类型数据,使其能够进行准确的数值分析。
首先,我们需要了解数据集中哪些列是object类型,以及它们内部的数据结构。通过df.info()和df.head()可以初步检查数据类型和前几行数据,从而发现潜在的问题。
假设我们有一个名为data.xlsx的数据集,其中包含笔记本电脑的各种属性,例如Memory Speed、Device Weight、Screen Size、Max Processor Speed、RAM (System Memory)和SSD Capacity等。
import pandas as pd
import numpy as np
# 加载数据集
dataset = pd.read_excel('data.xlsx')
# 查看数据集信息
print("--- 原始数据集信息 ---")
print(dataset.info())
# 查看数据集前几行
print("\n--- 原始数据集前5行 ---")
print(dataset.head())从dataset.info()的输出中,我们可以看到许多列,如Memory Speed、Device Weight、Screen Size等,都被识别为object类型。而dataset.head()的输出则揭示了这些object列中包含的实际数据:例如Memory Speed可能包含“2666 MHz”,Device Weight包含“2 - 4 kg”,Screen Size包含“15.6 inches”,SSD Capacity包含“256 GB”或“1 TB”。这些都是带有单位的数值,或者包含范围、特殊分隔符的数值。
直接对这些object列使用describe()函数(即使include='all')也无法提供准确的数值统计信息,因为它会将它们视为分类数据。
# 尝试使用describe(include='all')查看原始数据集的描述性统计
print("\n--- 原始数据集的描述性统计 (include='all') ---")
print(dataset.describe(include="all"))此时,对于object类型的列,describe()只会给出count、unique、top和freq等信息,而不会计算均值、标准差等数值统计量。
要计算这些“对象”类型列的均值,我们必须将其转换为数值类型。这需要一个逐列、逐值的细致处理过程,以应对数据中的各种复杂情况。
我们将遍历DataFrame中的每一列。如果一列是object类型,我们将对其进行以下处理:
# 创建一个新的DataFrame用于存储清洗后的数据
df_cleaned = pd.DataFrame(columns=dataset.columns)
for col in dataset.columns: # 遍历每一列
if dataset[col].dtypes == "object": # 如果列的数据类型是'object'
values = [] # 初始化一个空列表来存储处理后的值
for val in dataset[col].values: # 遍历列中的每一个值
if pd.isna(val): # 如果值是NaN
values.append(np.nan) # 添加NaN
elif isinstance(val, (int, float)): # 如果值已经是数字类型(即使列是object,也可能有个别是数字)
values.append(float(val))
elif " " in str(val): # 如果值中包含空格(通常表示数值和单位)
val_splitted = str(val).split(" ") # 按空格分割
# 检查并替换逗号为小数点
if "," in val_splitted[0]:
val_splitted[0] = val_splitted[0].replace(",", ".")
if len(val_splitted) == 2: # 如果分割后只有两部分(数值和单位)
try:
# 特殊处理 'SSD Capacity' 列,统一单位
if col == "SSD Capacity":
if val_splitted[1].upper() == "GB": # 如果单位是GB
values.append(float(val_splitted[0]) / 1000) # 转换为TB
elif val_splitted[1].upper() == "TB": # 如果单位是TB
values.append(float(val_splitted[0])) # 直接使用
else: # 其他未知单位,保留原值
values.append(val)
# 特殊处理 'Device Weight' 列,取均值
elif col == "Device Weight" and "-" in val_splitted[0]:
weight_range = val_splitted[0].split("-")
avg_weight = (float(weight_range[0]) + float(weight_range[1])) / 2
values.append(avg_weight)
else: # 其他列,直接尝试转换为浮点数
values.append(float(val_splitted[0]))
except ValueError: # 如果转换失败,保留原值
values.append(val)
else: # 如果分割后不是两部分(例如 "1920 x 1080" 或其他复杂字符串),保留原值
values.append(val)
else: # 如果不含空格,直接尝试转换为浮点数
try:
# 检查并替换逗号为小数点
if "," in str(val):
val = str(val).replace(",", ".")
values.append(float(val))
except ValueError: # 如果转换失败,保留原值
values.append(val)
df_cleaned[col] = values # 将处理后的值赋给新DataFrame的对应列
else: # 如果列不是'object'类型,直接复制
df_cleaned[col] = dataset[col]
# 再次查看清洗后数据集的信息和描述性统计
print("\n--- 清洗后数据集信息 ---")
print(df_cleaned.info())
print("\n--- 清洗后数据集的描述性统计 (include='all') ---")
print(df_cleaned.describe(include="all"))运行上述代码后,df_cleaned.info()会显示许多列的数据类型已成功转换为float64。此时,df_cleaned.describe(include="all")将能够为这些数值列提供准确的描述性统计信息,包括均值(mean)、标准差(std)、最小值(min)、25%分位数、中位数(50%分位数)、75%分位数和最大值(max)。
例如,根据示例输出,我们可以看到Memory Speed、Screen Size、Max Processor Speed、RAM (System Memory)和SSD Capacity等列现在都有了正确的数值统计量。
| Memory Speed | Screen Size | Backlit | Max Processor Speed | RAM (System Memory) | SSD Capacity | |
|---|---|---|---|---|---|---|
| count | 888.000 | 994.000 | 994.000 | 950.000 | 987.000 | 991.000 |
| mean | 3339.874 | 15.336 | 0.243 | 4.293 | 17.431 | 0.638 |
| std | 626.284 | 0.923 | 0.429 | 0.616 | 12.235 | 0.423 |
| min | 1066.000 | 10.000 | 0.000 | 1.050 | 4.000 | 0.000 |
| 25% | 3200.000 | 15.600 | 0.000 | 4.200 | 8.000 | 0.500 |
| 50% | 3200.000 | 15.600 | 0.000 | 4.400 | 16.000 | 0.512 |
| 75% | 3200.000 | 15.600 | 0.000 | 4.700 | 16.000 | 1.000 |
| max | 6400.000 | 18.400 | 1.000 | 5.600 | 128.000 | 4.000 |
将Pandas中object类型的数值数据转换为可计算的数值类型是数据预处理中的一个常见且关键的步骤。通过系统性地处理缺失值、分离数值与单位、统一小数点格式、标准化单位以及健壮的错误处理,我们可以成功地将这些混合数据转换为纯数值类型。这不仅解锁了对数据进行描述性统计分析的能力,也为后续更深入的数据建模和机器学习任务奠定了坚实的基础。理解数据模式并灵活运用Python和Pandas的数据处理功能,是成为高效数据分析师的关键技能。
以上就是Pandas中处理对象类型数据并计算均值:从数据清洗到数值分析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号