MST

星途 面试题库

面试题:Python中Pandas数据清洗性能优化及场景应用

在处理大规模数据集(例如百万行以上)时,使用Pandas进行数据清洗会遇到性能瓶颈。请阐述你对优化Pandas数据清洗性能的理解和经验,结合实际应用场景,说明如何在保持数据准确性的前提下,尽可能提高清洗效率。并给出关键优化代码示例。
48.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

理解与经验

  1. 分块处理
    • 对于大规模数据集,一次性读入内存处理会导致内存不足。分块读入数据,每次处理一部分数据,可以有效降低内存压力。例如在读取CSV文件时,设置chunksize参数。
  2. 向量化操作
    • Pandas的向量化操作比循环遍历每一个数据点要快得多。尽量使用内置的向量化函数,避免使用apply方法(尤其是在DataFrame上),除非没有其他替代方案。因为apply在底层会进行循环,性能较低。
  3. 数据类型优化
    • 确保数据列使用合适的数据类型。例如,对于整数列,如果其范围较小,可以使用np.int8np.int16等较小的数据类型代替默认的np.int64,这样可以减少内存占用,提升处理速度。
  4. 避免链式索引
    • 链式索引可能导致意想不到的结果,并且性能不佳。尽量使用lociloc进行索引和赋值操作,以确保代码的可读性和性能。
  5. 并行处理
    • 利用多核CPU进行并行计算。可以使用dask等库,它与Pandas的接口类似,支持并行处理大规模数据集。

实际应用场景与优化

假设我们有一个包含百万行销售数据的CSV文件,需要清洗数据,例如去除重复行、填充缺失值等。

关键优化代码示例

  1. 分块读取与处理
import pandas as pd

# 分块读取CSV文件
chunk_size = 100000
for chunk in pd.read_csv('sales_data.csv', chunksize = chunk_size):
    # 去除重复行
    chunk = chunk.drop_duplicates()
    # 填充缺失值,假设销售金额列有缺失值,填充为0
    chunk['sales_amount'] = chunk['sales_amount'].fillna(0)
    # 这里可以进行其他清洗操作
    # 将处理后的chunk写入新文件或数据库等
    chunk.to_csv('cleaned_sales_data.csv', mode='a', index=False, header = False if 'a' in locals() else True)
  1. 向量化操作示例: 假设我们有一个DataFrame,需要对某一列数据进行标准化处理(减去均值除以标准差)。
import pandas as pd
import numpy as np

data = {'col1': np.random.randn(1000000)}
df = pd.DataFrame(data)
# 向量化操作计算均值和标准差
mean_value = df['col1'].mean()
std_value = df['col1'].std()
# 向量化标准化
df['col1'] = (df['col1'] - mean_value) / std_value
  1. 数据类型优化示例
import pandas as pd
import numpy as np

data = {'col1': np.random.randint(0, 100, size = 1000000)}
df = pd.DataFrame(data)
# 查看原始数据类型
print(df.dtypes)
# 将col1的数据类型改为np.int8
df['col1'] = df['col1'].astype(np.int8)
# 查看修改后的数据类型
print(df.dtypes)