科研数据处理,80% 的任务是这五件事:读数据、清洗数据、筛选和分组、画图、导出结果。Pandas 加 Matplotlib 覆盖这五件事,代码可以直接复制用。
环境准备
conda create -n research python=3.11 conda activate research pip install pandas matplotlib openpyxl jupyter lab
操作 1:读取数据
import pandas as pd
# CSV
df = pd.read_csv("data.csv")
# Excel(需要 openpyxl)
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
# 读入后先看
print(df.head()) # 前 5 行
print(df.shape) # (行数, 列数)
print(df.dtypes) # 每列数据类型
print(df.describe()) # 数值列基本统计
读入数据后第一步:看 head() 和 dtypes,确认数据被正确识别,日期列是否被当成字符串,数字列有没有混进文字。
操作 2:数据清洗
# 检查缺失值
print(df.isnull().sum())
# 删掉有缺失值的行
df_clean = df.dropna()
# 填充缺失值
df["col"] = df["col"].fillna(0) # 填 0
df["col"] = df["col"].fillna(df["col"].mean()) # 填均值
# 删除重复行
df = df.drop_duplicates()
# 重命名列
df = df.rename(columns={"old_name": "new_name"})
# 转数据类型
df["date_col"] = pd.to_datetime(df["date_col"]) # 字符串转日期
df["num_col"] = pd.to_numeric(df["num_col"], errors="coerce") # 无法转的变 NaN
操作 3:筛选和分组
# 筛选行
df_f = df[df["age"] > 25]
df_f = df[(df["age"] > 25) & (df["country"] == "Germany")]
# 选取列
df_sub = df[["name", "age", "score"]]
# 分组计算
summary = df.groupby("group_col")["value_col"].mean()
summary = df.groupby("group_col").agg(
mean_score=("score", "mean"),
count=("score", "count"),
std=("score", "std")
)
# 透视表
pivot = df.pivot_table(
values="score",
index="condition",
columns="group",
aggfunc="mean"
)
操作 4:Matplotlib 可视化
import matplotlib.pyplot as plt
# 折线图(时间序列)
plt.figure(figsize=(10, 5))
plt.plot(df["time"], df["value"], color="steelblue", label="Experiment A")
plt.xlabel("Time (days)")
plt.ylabel("Measurement (AU)")
plt.title("Experiment A over time")
plt.legend()
plt.tight_layout()
plt.savefig("fig1.png", dpi=300) # 期刊要求 300 dpi 以上
plt.show()
# 柱状图(含误差条)
groups = ["Control", "Treatment A", "Treatment B"]
means = [12.3, 15.8, 14.1]
errors = [0.8, 1.2, 0.9]
plt.figure(figsize=(8, 5))
plt.bar(groups, means, yerr=errors, capsize=5,
color=["gray", "steelblue", "salmon"])
plt.ylabel("Response (mean ± SD)")
plt.tight_layout()
plt.savefig("fig2.png", dpi=300)
plt.show()
# 散点图
plt.figure(figsize=(7, 7))
plt.scatter(df["x"], df["y"],
c=df["group"].astype("category").cat.codes,
cmap="tab10", alpha=0.7)
plt.xlabel("Variable X")
plt.ylabel("Variable Y")
plt.tight_layout()
plt.savefig("scatter.png", dpi=300)
plt.show()
操作 5:导出结果
# CSV
df.to_csv("results.csv", index=False)
# Excel(多 Sheet)
with pd.ExcelWriter("results.xlsx") as writer:
df_summary.to_excel(writer, sheet_name="Summary")
df_raw.to_excel(writer, sheet_name="Raw data")
# LaTeX 表格(直接用于论文)
print(summary.to_latex(float_format="%.3f"))
常见问题
- 中文乱码:
pd.read_csv("data.csv", encoding="utf-8-sig") - Matplotlib 中文显示:
plt.rcParams["font.family"] = "Heiti TC"(Mac)或"SimHei"(Windows) - 图分辨率不够:
plt.savefig("fig.png", dpi=300)
这五个操作的代码可以直接复制进 Jupyter Notebook 使用,按需替换列名和文件路径。数据清洗完成后 groupby,groupby 完成后可视化,可视化确认无误后导出——这个顺序不会出错。

