Python + Pandas 科研数据处理入门:5 个最常用操作,含可视化代码

科研数据处理,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 完成后可视化,可视化确认无误后导出——这个顺序不会出错。

上一篇 德国广播费(Rundfunkbeitrag/GEZ):必须交吗,谁可以减免,怎么缴费
下一篇 Neuschwanstein and Königssee Day Trips from Munich: Complete Transport and Ticket Guide