当前位置: 首页 > news >正文

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 更快更稳(适合中间结果缓存)。
  • sepheader/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"] 包含 ciloc[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 区分清楚。
  • 可视化:先聚合,后绘图,一行出图。
http://www.dtcms.com/a/337431.html

相关文章:

  • (第十八期)图像标签的三个常用属性:width、height、border
  • 特赞内容运营解决方案,AI重构品牌内容价值链
  • 云计算学习100天-第21天
  • 整体设计 之“凝聚式中心点”原型 --整除:智能合约和DBMS的深层融合 之2
  • 将 iPhone 联系人转移到 Infinix 的完整指南
  • MCP ZAP Server:一款能够利用大模型替代人工进行Web安全扫描的开源MCP
  • Vue深入组件:组件 v-model 详解2
  • 网络安全巡检系统的功能组成和作用
  • sizeof和strlen的对比分析
  • vue从入门到精通:搭建第一个vue项目
  • kali linux从入门到精通教程
  • 【GM3568JHF】FPGA+ARM异构开发板烧录指南
  • Go并发编程-goroutine
  • 智能人形机器人:知识驱动的工业生产力革新
  • 视觉语言导航(11)——预训练范式 4.1
  • 系统架构师考试-操作系统-10道关于PV操作和死锁的模拟题
  • 实现一个函数,使用引用作为参数完成三个字符串按长度排序,最长的字符串放入第一个参数,最短的字符串放入第三个参数(不允许使用 string)
  • Linx--MySQL--安装笔记详细步骤!
  • 石英挠性加速度计:高精度测量的理想之选?
  • Windows安装python
  • 使用 uv管理 Python 虚拟环境:比conda更快、更轻量的现代方案
  • Baumer高防护相机如何通过YoloV8深度学习模型实现手势识别和指尖检测识别(C#代码UI界面版)
  • Java基础数据类型笔试面试中的“坑”
  • 第4章-04-用WebDriver页面元素操作
  • C 语言数据结构与算法的复杂度分析:从理论到实战的效率衡量指南
  • Qwen Code宣布每天免费调用2000次,且无Token限制
  • Webrtc在项目中承担的角色
  • 20250818在荣品的PRO-RK3566开发板跑Buildroot的时候使用在线秒表https://tool.hiofd.com/stopwatch/
  • 【iOS】Block补充
  • 一道同分排名的SQL题