df.str.split.tolist()
这是一个 pandas.DataFrame对象的方法,将DataFrame对象中的每个元素按照指定的分隔符进行分割,并将结果存储为列表形式返回。具体来说,str.split()方法可以接受分隔符作为参数,并对DataFrame对象中的每个元素都执行一次字符串分割操作,最终将所有分割结果存储为一个列表。tolist()方法用于将分割后的结果转换为一个列表对象并返回。
df.str.split.to_list()的功能
df.str.split.to_list()是 pandas 的一个方法,它能将 Series 中每个元素按指定的分隔符分割成一个列表,并将所有列表组成一个嵌套列表返回。例如,如果将一个包含字符串的 Series 调用 df.str.split.to_list() 方法,就可以得到一个嵌套列表,它的每个元素对应于原始 Series 中的一个字符串,该元素是由该字符串分割后得到的子字符串列表。
import pandas as pd import numpy as np import os def preprocess_data(file_path): """数据预处理主函数,保留原始表格结构""" try: # ===== 数据读取 ===== # 读取时保留原始表头结构(header=1对应实际数据开始行) df = pd.read_excel(file_path, sheet_name='Sheet1', header=1) print("原始数据维度:", df.shape) # ===== 列名修复 ===== # 重命名关键列(根据实际数据位置) df = df.rename(columns={ df.columns[0]: '一级指标', df.columns[1]: '空列1', # 原始表格中的空白列 df.columns[2]: '二级指标', df.columns[3]: '空列2', df.columns[4]: '空列3', df.columns[5]: '空列4' }) # ===== 结构还原 ===== # 删除原始表格中的空白列(保留实际数据列) df = df.drop(columns=['空列1','空列2','空列3','空列4']) # 合并一级指标(模拟原始表格的合并单元格效果) df['一级指标'] = df['一级指标'].ffill() # ===== 数据清洗 ===== # 清洗二级指标名称 df['二级指标'] = df['二级指标'].str.split('(').str[0].str.strip() # ===== 数值处理 ===== # 识别年份列(2010-2024) year_cols = [col for col in df.columns if str(col).isdigit()] print("识别到的年份列:", year_cols) # 统一缺失值处理(替换多种缺失标记) df[year_cols] = df[year_cols].replace(['无', '', 'NA', 'NaN'], np.nan) # 特殊列处理 if '海关进出口总值(万美元)' in df['二级指标'].values: idx = df[df['二级指标'] == '海关进出口总值(万美元)'].index df.loc[idx, year_cols] = ( df.loc[idx, year_cols] .astype(str) .replace('nan', np.nan) .apply(lambda x: x.str.replace(r'e\+0?', 'e', regex=True)) .astype(float) ) # ===== 类型转换 ===== for col in year_cols: df[col] = pd.to_numeric(df[col], errors='coerce') # ===== 缺失值处理 ===== # 横向插值(按时间序列趋势填充) df[year_cols] = df[year_cols].interpolate(axis=1, method='linear', limit_direction='both') # 列均值填充剩余缺失值 for col in year_cols: df[col] = df[col].fill
首先,列名修复可能指的是列名中有空格、特殊字符或者需要重命名的情况。用户可能需要自动清理列名,比如去掉空格,转换成小写,或者替换特殊字符。这时候,使用df.columns.str方法可能有用,比如用strip()去空格,replace替换字符,或者lower()转小写。
然后是数值处理,可能包括类型转换,比如将字符串转为数值,处理千分位符号,或者处理货币符号。比如,用pd.to_numeric转换,结合errors参数处理错误,或者用replace方法去掉不需要的字符。
缺失值处理的话,用户可能想用更智能的方法填充,而不是简单删除。根据数据类型,数值型可以用均值、中位数,分类型用众数。这时候fillna方法就派上用场了。同时,可能需要先检查缺失值的分布,比如用isnull().sum()来查看每列缺失情况,再决定如何处理。例如,如果某列缺失太多,可能直接删除该列,或者用插值法填充。
另外,用户提到的参考引用里提到sheetnames参数,所以在读取Excel时可能需要指定不同的sheet,或者处理多个sheet的情况。但用户的问题里可能没有提到多sheet,所以可能暂时不需要处理。
接下来,优化代码可能需要将以上步骤整合成一个流程,使用函数或者链式调用提高效率。比如,使用pipe方法将多个处理步骤串联起来,或者自定义函数处理列名、数值和缺失值。
还要注意性能问题,比如读取Excel时指定dtype参数减少内存占用,或者使用category类型处理分类型数据。处理大数据集时,分块读取可能也有帮助,但用户的问题可能更多是代码结构优化,而不是性能优化。
另外,异常处理也很重要,比如在转换数值时处理错误,或者在填充缺失值时检查是否存在足够的非空值来计算均值或众数。可能需要使用try-except块,或者Pandas的errors参数。
最后,代码的可读性和可维护性也需要优化,比如添加注释,将不同处理步骤模块化,或者使用配置文件来指定需要处理的列和填充策略。
现在,结合用户提供的引用内容,引用[4]提到用fillna方法填充缺失值,根据数据类型选择不同的统计量。引用[3]提到如何找到缺失值最多的列,可能在处理时优先处理这些列。引用[1]和[2]关于读取Excel和CSV的方法,可能需要确保读取时的参数正确,比如excel_writer和sheetnames。
总结一下,优化步骤可能包括:
- 自动清理列名。
- 转换数值类型,处理异常字符。
- 检查缺失值分布,选择合适的填充策略。
- 使用链式方法或函数封装处理流程。
- 添加异常处理和日志记录。
- 根据数据类型动态选择填充方法,如数值用均值,分类型用众数。
- 测试代码在不同数据集上的鲁棒性。
可能需要示例代码来展示这些优化步骤,比如使用rename函数清理列名,apply结合pd.to_numeric处理数值列,以及自定义函数处理缺失值填充。同时,参考引用中的方法,如fillna的参数设置,以及检查缺失值的方法。### 分步优化方案
1. 列名规范化处理
使用字符串操作统一处理列名中的空格、特殊字符和大小写问题:
def clean_columns(df):
df.columns = df.columns.str.strip().str.lower().str.replace(r'[^\w]', '_', regex=True)
return df
2. 数值型数据处理
通过正则表达式清除货币符号、千分位分隔符后转换为数值类型:
def convert_numeric(df, columns):
for col in columns:
df[col] = df[col].replace('[\$,]', '', regex=True)
df[col] = pd.to_numeric(df[col], errors='coerce') # 处理转换失败的情况[^2]
return df
3. 缺失值智能填充
根据数据类型自动选择填充策略,并优先处理高缺失率列:
def smart_fillna(df, threshold=0.3):
# 删除高缺失率列
missing_ratio = df.isnull().mean()
df = df.drop(columns=missing_ratio[missing_ratio > threshold].index.tolist())
# 按数据类型填充
for col in df.columns:
if df[col].dtype in ['int64', 'float64']:
fill_value = df[col].median() if df[col].skew() > 1 else df[col].mean()
else:
fill_value = df[col].mode()[0] if not df[col].mode().empty else 'unknown'
df[col] = df[col].fillna(fill_value)
return df
4. 完整处理流程整合
# 读取时指定数据类型优化内存
dtype_dict = {'salary': 'float32', 'age': 'int16'}
df = pd.read_excel('员工表.xlsx', dtype=dtype_dict, sheet_name='Sheet1')[^1]
# 链式调用处理流程
processed_df = (df
.pipe(clean_columns)
.pipe(convert_numeric, ['salary', 'sales_amount'])
.pipe(smart_fillna)
.assign(join_date=lambda x: pd.to_datetime(x['join_date']))
)
关键优化点说明
- 内存优化:通过
dtype
参数指定列数据类型,可减少40%-70%内存占用 - 异常处理:
pd.to_numeric
使用errors='coerce'
时,将非法值转为NaN便于后续处理[^2] - 动态填充:数值型根据偏度选择中位数/均值,分类型使用众数填充[^4]
- 自动化处理:列名清洗、数据类型转换、缺失值处理形成标准化流程
进阶优化建议
- 使用
pd.read_excel(..., usecols=cols_list)
限制读取列提升效率 - 对分类型数据使用
astype('category')
转换节省内存 - 添加异常日志记录:
try: df = pd.read_excel(...) except Exception as e: print(f"文件读取失败: {str(e)}")
相关推荐

















