Pandas - Dataframe 用to_numeric类型转换后比对数据

在使用Pandas DataFrame进行数据对比时,遇到String类型转换为object的问题。通过应用`pd.to_numeric`函数,可以将数据转换为数值类型。此函数允许设置参数errors='ignore',忽略非数字字符串,保持原有数据不变,尤其适用于包含时间类型的数据处理。

用Pandas Dataframe 做数据对比时踩的坑:

1.  String 转成 Dataframe后数据类型被置为了object

| cnt  |
| 461  |
expect_table = request.context[entity]
logger.info(f"EXPECTED DATAFRAME: {expect_table}")

for field_count, field in enumerate(datatable.query_table.rows):  # pylint: disable=W0612-
        actualdf = actualdf.append(field, ignore_index=True)

2021-09-13 17:48:49,841 - test.step_defs.test_datalake_steps - INFO - EXPECTED DATAFRAME:    cnt
0  461
2021-09-13 17:48:49,862 - test.step_defs.test_datalake_steps - INFO - Actual DATAFRAME:   cnt
0  461

 Attribute "dtype" are different
E       [left]:  object
E       [right]: int64

2. 用pandas的数据类型转换方法pd.to_numeric解决:

datatable.query_table = parse_str_table(table_with_header)
    expect_table = request.context[entity]
    logger.info(f"EXPECTED DATAFRAME: {expect_table}")
    actualdf = pd.DataFrame()
    for field_count, field in enumer
import pandas as pd import numpy as np import os from openpyxl import Workbook from openpyxl.utils.dataframe import dataframe_to_rows # 设置路径 folder_path = r'D:\Class\能管比对\导出文件' # 修改为你存放 .xlsx 的文件夹 output_file = r'D:\Class\能管比对\每日结果\汇总结果_变异系数大于0.2.xlsx' # 存储符合条件的列信息 results = [] # 循环处理每个 .xlsx 文件 for file_name in os.listdir(folder_path): if not file_name.endswith('.xlsx') or file_name.startswith('~$'): continue # 跳过非Excel文件和临时文件 file_path = os.path.join(folder_path, file_name) try: excel_file = pd.ExcelFile(file_path) except Exception as e: print(f"无法读取文件: {file_name}, 错误: {e}") continue print(f"\n正在处理文件: {file_name}") for sheet_name in excel_file.sheet_names: df = pd.read_excel(excel_file, sheet_name=sheet_name) if df.empty or len(df) < 25: continue # 数据不足25行跳过 # 取前25行用于分析 data_block = df.iloc[:25].copy() for col_idx in range(1, len(data_block.columns)): # 跳过第0列(时间列) col_name = df.columns[col_idx] series = data_block.iloc[:, col_idx] # 转换为数值型,剔除无效值 numeric_data = pd.to_numeric(series, errors='coerce').dropna() if len(numeric_data) < 2: continue mean_val = numeric_data.mean() std_val = numeric_data.std(ddof=0) cv = std_val / mean_val if mean_val != 0 else np.nan if pd.notna(cv) and cv > 0.2: # 提取整列原始数据(不限于前25行) full_col_data = df.iloc[:, col_idx].reset_index(drop=True) results.append({ '源文件': file_name, 'Sheet': sheet_name, '列名': col_name, '均值': round(mean_val, 6), '标准差': round(std_val, 6), '变异系数(CV)': round(cv, 6), '原始数据': full_col_data # 后续会拼接到表格中 }) print(f"✅ 发现高变异列: {file_name} | {sheet_name} | 列'{col_name}', CV={cv:.6f}") # ================== 汇总输出到 Excel ================== if not results: print("\n⚠️ 未发现变异系数大于 0.2 的列。") else: print(f"\n📊 共找到 {len(results)} 个变异系数 > 0.2 的列,开始生成汇总文件...") with pd.ExcelWriter(output_file, engine='openpyxl') as writer: summary_list = [] data_dfs = [] for i, res in enumerate(results): # 构造摘要行 summary_row = { '源文件': res['源文件'], 'Sheet': res['Sheet'], '列名': res['列名'], '均值': res['均值'], '标准差': res['标准差'], '变异系数(CV)': res['变异系数(CV)'] } summary_list.append(summary_row) # 构造带标签的数据列(添加说明头) col_data = res['原始数据'].copy() col_data.index.name = None # 添加来源信息作为列名前缀 new_series = pd.Series([f"{res['源文件']} | {res['Sheet']} | {res['列名']}"]) new_series = pd.concat([new_series, col_data], ignore_index=True) data_dfs.append(new_series) # 写入“汇总统计”sheet summary_df = pd.DataFrame(summary_list) summary_df.to_excel(writer, sheet_name='汇总统计', index=False) # 合并所有高变异列到“原始数据”sheet(横向排列) if data_dfs: combined_df = pd.concat(data_dfs, axis=1) # 重命名列为 Col1, Col2... combined_df.columns = [f"列_{i + 1}" for i in range(len(data_dfs))] combined_df.to_excel(writer, sheet_name='高变异数据列', index=False) print(f"✅ 汇总完成!结果已保存至:\n {output_file}") ——改代码不需要列出 '列名': res['列名'],这一项,其余保留不变
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值