中文

Python数据处理实战:用Pandas清洗和可视化材料实验数据

为什么学Pandas

做实验的同学经常面对这样的场景:拉力机导出一个Excel、AFM导出一个CSV、SEM数据又是另一个文件夹。手动在Excel里合并、筛选、画图,耗时且容易出错。

Pandas是Python的数据处理瑞士军刀。学一次,终身受益。


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

1. 读取实验数据

最常见的三种格式:


# Excel(最常见)
df = pd.read_excel("mechanical_tests.xlsx", sheet_name="Sheet1")

# CSV/TXT(AFM、拉力机等导出)
df = pd.read_csv("force_curves.csv")

# 多个文件合并
import glob
files = glob.glob("data/*.csv")
dfs = [pd.read_csv(f) for f in files]
df_all = pd.concat(dfs, ignore_index=True)

2. 数据清洗

实验数据永远不干净。以下是常见问题和处理:


# 删除完全空的行/列
df = df.dropna(how="all")

# 重命名列(英文方便代码操作)
df = df.rename(columns={
    "纤维直径(nm)": "fiber_diameter_nm",
    "杨氏模量(GPa)": "youngs_modulus_GPa",
    "处理条件": "treatment"
})

# 去除异常值(3-sigma原则)
for col in ["youngs_modulus_GPa", "fiber_diameter_nm"]:
    mean = df[col].mean()
    std = df[col].std()
    df = df[(df[col] > mean - 3*std) & (df[col] < mean + 3*std)]

3. 分组统计

实验室最常用的分析——按处理条件分组看统计量:


summary = df.groupby("treatment").agg({
    "youngs_modulus_GPa": ["mean", "std", "count"],
    "fiber_diameter_nm": ["mean", "std"],
}).round(2)

print(summary)

输出类似:


           youngs_modulus_GPa          fiber_diameter_nm
                        mean   std count            mean   std
treatment
ethanol                 1.80  0.14     3           51.67  2.52
methanol                3.48  0.28     3           48.00  3.61

4. 数据可视化

四种最常用的科研图表:


fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# A: 箱线图——比较不同处理的模量分布
df.boxplot(column="youngs_modulus_GPa", by="treatment", ax=axes[0,0])
axes[0,0].set_title("Young's Modulus by Treatment")

# B: 散点图——纤维直径 vs 模量
axes[0,1].scatter(df["fiber_diameter_nm"], df["youngs_modulus_GPa"], alpha=0.6)
axes[0,1].set_xlabel("Fiber Diameter (nm)")
axes[0,1].set_ylabel("Young's Modulus (GPa)")

# C: 柱状图(带误差棒)
means = summary[("youngs_modulus_GPa", "mean")]
stds = summary[("youngs_modulus_GPa", "std")]
axes[1,0].bar(means.index, means.values, yerr=stds.values, capsize=5)
axes[1,0].set_ylabel("Young's Modulus (GPa)")

# D: 相关性热力图
corr = df.select_dtypes(include=np.number).corr()
im = axes[1,1].imshow(corr, cmap="RdBu_r", vmin=-1, vmax=1)
plt.colorbar(im, ax=axes[1,1])

plt.tight_layout()
plt.savefig("mechanical_analysis.pdf", dpi=150, bbox_inches="tight")

5. 导出结果


# 导出统计摘要
summary.to_csv("mechanical_summary.csv")

# 导出清洗后的数据
df.to_csv("cleaned_data.csv", index=False)

# 导出为Excel(多个sheet)
with pd.ExcelWriter("results.xlsx") as writer:
    df.to_excel(writer, sheet_name="Raw Data", index=False)
    summary.to_excel(writer, sheet_name="Summary")

6. 常见坑

问题解决
------------
中文列名报错改成英文列名
编码错误pd.read_csv("file.csv", encoding="utf-8")"gbk"
大文件读取慢指定dtype,或用chunksize分批读
日期格式乱pd.to_datetime(df["date"], format="%Y-%m-%d")

小结

Pandas解决的是实验室80%的数据处理需求。花一小时学会这五个操作——读取、清洗、分组、画图、导出——你的数据处理效率会提高一个数量级。

💬 Questions or Feedback?

This blog is actively maintained by a PhD researcher. Reach out on GitHub for collaborations or corrections.

View on GitHub