You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按原格式保存处理后的Excel/CSV数据?

问题:Pandas处理后的数据无法按原格式保存到Excel/CSV

我想用Pandas把处理后的数据按原格式保存到另一个Excel/CSV文件。原Excel文件内容如下:

num1,num2
1,   4
2,   5
3,   6
80,  120

现在遇到两个问题:

  • 使用series1.to_excel('004.xlsx',index=False)时,输出文件仅保留num2列,num1列丢失
  • 使用series1.to_csv('004.csv',mode='a',index=False)时,两列数据会按行依次追加,无法保持原有的并排格式

期望的输出格式:

num1,num2
1,   4
2,   5
3,   6
2.5, 3.75

以下是我的代码:

import numpy as np
import pandas as pd

df_excel = pd.read_excel('002.xlsx')
df = df_excel
for col in df.columns:
    df_current_col = df[col]
    series1 = pd.Series(df_current_col)
    s = (series1.quantile(0.75)-series1.quantile(0.25))
    iqr = 3 * s
    val_low = series1.quantile(0.25) - iqr*0.5
    val_up = series1.quantile(0.25) + iqr*0.5
    outlier = series1[(series1 > val_up)|(series1 < val_low)]
    normal_val = series1[(series1 < val_up)|(series1 > val_low)]
    outlier = np.array(outlier)
    sum = 0
    normal_val = np.array(normal_val)
    for i in range(len(normal_val)):
        sum+=normal_val[i]
    mean = sum / (len(normal_val))
    if outlier is  None:
        print('NONE')
    else:
        for i ,val in enumerate(series1):
            series1[i] = float(np.where((((val < val_low) | (val > val_up))), mean, val))
        ########
        #series1.to_excel('004.xlsx',index=False)
        series1.to_csv('004.csv',mode='a',index=False)

问题根源

你当前的代码是逐列处理后单独保存每一列,导致Excel被覆盖、CSV行追加的问题。正确做法是将处理后的列更新回原DataFrame,最后一次性保存整个DataFrame,才能保留列的并排格式。

修正后的代码

import numpy as np
import pandas as pd

# 读取原数据
df = pd.read_excel('002.xlsx')

# 遍历每一列处理异常值
for col in df.columns:
    series = df[col]
    # 计算四分位数和IQR
    q25 = series.quantile(0.25)
    q75 = series.quantile(0.75)
    s = q75 - q25
    iqr = 3 * s
    val_low = q25 - iqr * 0.5
    val_up = q25 + iqr * 0.5  # 若需标准IQR上下限,可改为q75 + 1.5*iqr
    
    # 筛选正常值并计算均值(修正原逻辑错误:用&而非|)
    normal_val = series[(series >= val_low) & (series <= val_up)]
    mean = normal_val.mean()
    
    # 替换异常值为均值
    df[col] = np.where((series < val_low) | (series > val_up), mean, series)

# 一次性保存整个DataFrame
df.to_excel('004.xlsx', index=False)
# 或保存为CSV
# df.to_csv('004.csv', index=False)

关键修正点

  1. 直接更新原DataFrame列:处理完列后赋值回df[col],而非单独保存Series
  2. 修正正常值筛选逻辑:原代码用|会把所有数据判定为正常值,改为&筛选区间内的有效值
  3. 简化均值计算:用Pandas内置mean()替代手动循环求和,高效且简洁
  4. 统一保存整个DataFrame:避免逐列保存导致的格式混乱

内容的提问来源于stack exchange,提问作者a.T tang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:31:33