Pandas 数据导入导出、索引、分组聚合与可视化
Pandas 数据导入导出、索引、分组聚合与可视化一日速通(基于 day06/代码
)
本文基于 02-数据处理和统计分析/day06/代码
,用最少的文字带你快速梳理 Pandas 的核心能力:数据导入导出、索引选取、分组聚合、计数方法与可视化。示例数据来自 data/gapminder.tsv
(制表符分隔)、movie.pkl
等。
一、数据导入与导出(CSV/PKL/Excel)
- 读取:
pd.read_csv(path, sep=',')
:CSV;若是 TSV 用sep="\t"
pd.read_pickle(path)
:PKL(速度快,保类型)
- 导出:
df.to_csv(path, sep=',', header=True, index=False)
df.to_pickle(path)
df.to_excel(path, sheet_name='sheet')
import pandas as pd# 读取
df_csv = pd.read_csv("data/gapminder.tsv", sep="\t")
df_pkl = pd.read_pickle("data/movie.pkl")# 导出
df_csv.to_csv("data/gapminder_out.csv", index=False)
df_csv.to_excel("data/gapminder.xlsx", sheet_name="sheet1")
要点:
- CSV/Excel 更通用,PKL 更快更稳(适合中间结果缓存)。
sep
和header/index
参数要根据业务控制。
二、索引选择:loc vs iloc(核心区别一看就懂)
- 核心:
- loc:按标签(行名/列名);切片是闭区间(含终点)
- iloc:按位置(0 基);切片左闭右开(不含终点)
- 布尔索引:
- 用
loc
更安全直观:df.loc[df['col'] > 10]
- 用
iloc
需.values
防止对齐错位:df.iloc[(df['col'] > 10).values]
- 用
df = pd.read_csv("data/gapminder.tsv", sep="\t")# 行列选取
df.loc[0:2, ["country", "continent", "year"]] # 含 2
df.iloc[0:3, [0, 1, 2]] # 到 2# 单元格 / 子集
df.loc[0, "country"]
df.iloc[0, 0]# 布尔筛选
df.loc[df["year"] >= 2000, ["country", "lifeExp"]]
df.iloc[(df["year"] >= 2000).values, [0, 3]]
避坑:
loc["a":"c"]
包含c
;iloc[0:3]
不含 3。- 列子集返回 DataFrame 用双中括号:
df.loc[:, ["colA"]]
。
三、分组与聚合(5 种常用写法覆盖 90% 需求)
以 continent
分组,统计寿命 lifeExp
、人均 GDP gdpPercap
:
df = pd.read_csv("data/gapminder.tsv", sep="\t")# 1) 单字段分组,单指标聚合
df.groupby("continent")["lifeExp"].mean()# 2) 点语法(同上)
df.groupby("continent").lifeExp.mean()# 3) 单字段分组,多指标聚合
df.groupby("continent")[["lifeExp", "gdpPercap"]].mean()# 4) 多字段分组,多指标聚合
df.groupby(["country", "continent"])[["lifeExp", "gdpPercap"]].mean()# 5) agg 自定义不同指标不同函数
df.groupby("continent").agg({"lifeExp": "mean","gdpPercap": "max"
})
要点:
groupby
返回分组对象,链式加列后再聚合。- 多指标统一函数用
.mean()
,不同函数用.agg({...})
。
四、计数方法:count / size / unique / nunique(区别要记牢)
count()
:非空值计数(按列)size()
:分组后总体数量(含空值)unique()
:唯一值数组nunique()
:唯一值个数
# 每个洲的国家记录数(不去重)
df.groupby("continent")["country"].count()
df.groupby("continent")["country"].size()# 每个洲的国家数(去重)
df.groupby("continent")["country"].nunique()# 全表去重
df["country"].nunique() # 数量
df["country"].unique() # 值列表
记忆法:
- “nunique 是数量;unique 是列表;count 不数空;size 不管空。”
五、可视化:一行代码出图(Matplotlib)
按年统计平均寿命并画折线:
import pandas as pd
from matplotlib import pyplot as pltdf = pd.read_csv("data/gapminder.tsv", sep="\t")
year_lifeexp = df.groupby("year")["lifeExp"].mean()
year_lifeexp.plot(title="Average Life Expectancy by Year")
plt.xlabel("Year")
plt.ylabel("Life Expectancy")
plt.tight_layout()
plt.show()
建议:
- 画图前先
groupby + 聚合
得到结构化序列或 DataFrame。 - 非 Jupyter 环境需要
plt.show()
。
六、排序常用法(找 TopN/BottomN 特别快)
# 按列排序
df.sort_values(by="gdpPercap", ascending=False)# 取前/后 N
df.nlargest(5, "gdpPercap")
df.nsmallest(5, "lifeExp")
七、一个最小可运行示例(从读数据到出图)
import pandas as pd
from matplotlib import pyplot as pltdf = pd.read_csv("data/gapminder.tsv", sep="\t")# 1) 索引选择
subset = df.loc[0:4, ["country", "continent", "year", "lifeExp"]]# 2) 分组聚合
by_continent = df.groupby("continent").agg({"lifeExp": "mean","gdpPercap": ["mean", "max"]
})# 3) 计数对比
counts = {"records": df.groupby("continent")["country"].count(),"countries": df.groupby("continent")["country"].nunique()
}# 4) 可视化
df.groupby("year")["lifeExp"].mean().plot(title="LifeExp by Year")
plt.tight_layout()
plt.show()print(subset.head())
print(by_continent)
print(counts["records"])
print(counts["countries"])
结语
- 导入导出:CSV/Excel 通用,PKL 高效。
- 索引:
loc
看名、闭区间;iloc
看位置、左闭右开;布尔筛选优先loc
。 - 分组聚合:5 种写法足够日常分析;
agg
自由组合函数。 - 计数:
count/size/unique/nunique
区分清楚。 - 可视化:先聚合,后绘图,一行出图。