查看全课大纲(第 43 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

文件读写操作

约 8 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析工作中,我们处理的数据大多来自外部文件。本节课将系统学习如何使用 Pandas 进行 CSV 文件的读取、查看和保存,掌握如何高效地加载所需数据,并理解关键参数对数据处理流程的影响。

💡 核心导读

  • 选择性读取:使用 usecols 参数仅加载分析所需的列,提升效率并节省内存。
  • 索引设置:通过 index_col 参数在读取时直接指定索引列,简化后续操作。
  • 数据预览:使用 .info() 方法快速了解数据集的结构、数据类型和内存占用。
  • 数据保存:使用 .to_csv() 方法将处理结果保存为文件,并控制是否保存索引列。

1. 读取 CSV 文件:pd.read_csv()

pd.read_csv() 是 Pandas 读取 CSV 文件的核心函数。除了最基本的文件路径参数,我们还需要关注两个在实际项目中至关重要的参数:usecols 和 index_col。

1.1 使用 usecols 选择指定列

当数据文件包含数十甚至上百列时,我们可能只对其中的部分列感兴趣。一次性读取全部数据不仅耗时,还可能因内存不足导致程序崩溃。usecols 参数允许我们传入一个列名列表,Pandas 将只读取这些列。

1.2 使用 index_col 设置索引列

索引是 Pandas 数据结构的核心,用于高效地定位数据。我们可以在读取文件时,通过 index_col 参数直接指定某一列作为 DataFrame 的索引,省去后续手动设置的步骤。

下面的代码块模拟了从文件中读取数据的过程。注意:在实际项目中,filepath 应为真实的文件路径字符串。为了演示的可复现性,我们直接在内存中构造数据并模拟 read_csv 的关键功能。

import pandas as pd
import numpy as np

# 在内存中构造一个模拟的“幸福指数”数据集,模拟从文件读取的原始数据
data = {
    'Country': ['Denmark', 'Switzerland', 'Iceland', 'Norway', 'Finland'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe'],
    'Happiness Rank': [1, 2, 3, 4, 5],
    'Happiness Score': [7.526, 7.509, 7.501, 7.498, 7.413],
    'Economy (GDP per Capita)': [1.44, 1.36, 1.30, 1.46, 1.29],
    'Family': [1.35, 1.26, 1.35, 1.35, 1.32]
}
df_full = pd.DataFrame(data)

# 模拟使用 read_csv 的 usecols 和 index_col 参数
# 假设我们只关心以下四列,并希望将'Country'列设为索引
selected_columns = ['Country', 'Region', 'Happiness Rank', 'Happiness Score']
df_selected = df_full[selected_columns].copy()  # 模拟 usecols=selected_columns
df_with_index = df_selected.set_index('Country')  # 模拟 index_col='Country'

print("模拟:使用usecols选择指定列,并设置'Country'为索引后的数据:")
print(df_with_index)
模拟:使用usecols选择指定列,并设置'Country'为索引后的数据:
                     Region  Happiness Rank  Happiness Score
Country
Denmark      Western Europe               1            7.526
Switzerland  Western Europe               2            7.509
Iceland      Western Europe               3            7.501
Norway       Western Europe               4            7.498
Finland      Western Europe               5            7.413

可以看到,输出结果中 Country 列已变为索引,数据只包含我们指定的三列数据列。

2. 查看数据基本信息:.info()

将数据读入 DataFrame 后,第一步通常是使用 .info() 方法快速了解数据的整体情况。它会显示索引范围、每列的非空值数量、数据类型以及内存使用量,是探索性数据分析(EDA)的起点。

# 每个代码块自包含:重新构造 df_with_index
import pandas as pd

data = {
    'Country': ['Denmark', 'Switzerland', 'Iceland', 'Norway', 'Finland'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe'],
    'Happiness Rank': [1, 2, 3, 4, 5],
    'Happiness Score': [7.526, 7.509, 7.501, 7.498, 7.413]
}
df_with_index = pd.DataFrame(data).set_index('Country')

print("数据框的详细信息:")
df_with_index.info()
数据框的详细信息:
<class 'pandas.DataFrame'>
Index: 5 entries, Denmark to Finland
Data columns (total 3 columns):
 #   Column           Non-Null Count  Dtype
---  ------           --------------  -----
 0   Region           5 non-null      str
 1   Happiness Rank   5 non-null      int64
 2   Happiness Score  5 non-null      float64
dtypes: float64(1), int64(1), str(1)
memory usage: 160.0+ bytes

.info() 的输出告诉我们:

  • 索引是 Country,共有 5 个条目。
  • 数据共有 3 列,每列都有 5 个非空值,没有缺失。
  • 列出了每列的数据类型:Region 是字符串(pandas 3.0 默认的 str dtype),Happiness Rank 是整数,Happiness Score 是浮点数。
  • 最后给出了大致的内存占用量。

3. 数据处理与保存:.to_csv()

数据经过清洗、转换或分析后,通常需要保存下来。DataFrame.to_csv() 方法用于将数据保存为 CSV 文件。其中,index 参数至关重要,它控制是否将 DataFrame 的索引作为一列写入文件。

3.1 数据处理示例

假设我们需要基于“幸福分数”计算其四舍五入后的整数值。

# 基于df_with_index进行处理(重新构造以保持代码块独立)
import pandas as pd
import numpy as np

data_for_save = {
    'Country': ['Denmark', 'Switzerland', 'Iceland', 'Norway', 'Finland'],
    'Region': ['Western Europe', 'Western Europe', 'Western Europe', 'Western Europe', 'Western Europe'],
    'Happiness Rank': [1, 2, 3, 4, 5],
    'Happiness Score': [7.526, 7.509, 7.501, 7.498, 7.413]
}
df_to_save = pd.DataFrame(data_for_save).set_index('Country')

# 使用apply函数和np.around生成整数分数列
df_to_save['Int_Score'] = df_to_save['Happiness Score'].apply(np.around)
print("处理后的数据(新增Int_Score列):")
print(df_to_save)
处理后的数据(新增Int_Score列):
                     Region  Happiness Rank  Happiness Score  Int_Score
Country
Denmark      Western Europe               1            7.526        8.0
Switzerland  Western Europe               2            7.509        8.0
Iceland      Western Europe               3            7.501        8.0
Norway       Western Europe               4            7.498        7.0
Finland      Western Europe               5            7.413        7.0

3.2 保存数据:index 参数的区别

接下来,我们演示保存数据时,index 参数设为 True(默认)和 False 的区别。

# 演示to_csv的index参数。在实际操作中,filepath应为有效的保存路径。
# 此处仅展示参数用法,不实际执行文件写入。
print("保存操作说明(不实际写文件):")
print("1. 包含索引保存: df.to_csv('happiness_with_index.csv', index=True)")
print("   - 生成的文件将包含'Country'列作为第一列。")
print("2. 不包含索引保存: df.to_csv('happiness_no_index.csv', index=False)")
print("   - 生成的文件将从'Region'列开始,不包含'Country'列。")
保存操作说明(不实际写文件):
1. 包含索引保存: df.to_csv('happiness_with_index.csv', index=True)
   - 生成的文件将包含'Country'列作为第一列。
2. 不包含索引保存: df.to_csv('happiness_no_index.csv', index=False)
   - 生成的文件将从'Region'列开始,不包含'Country'列。

关键点:如果索引是数据分析的一部分(例如本例中的国家名),并且你希望下次读取时能直接恢复索引,则应设置 index=True 进行保存。如果索引只是临时的行号,或者你希望 CSV 文件更“干净”,则设置 index=False。

📝 动手练一练

  1. 概念辨析:在读取一个包含日期、产品、销量、单价、折扣五列的销售数据 CSV 文件时,如果你只关心总销售额分析,为了提升读取效率,应该使用 pd.read_csv() 的哪个参数?应该指定哪些列?

    👉 点击查看参考答案

    应该使用 usecols 参数。因为总销售额通常由销量和单价计算得出(可能还需考虑折扣),所以至少需要指定 ['销量', '单价'] 这两列。如果折扣影响最终收入,则还需加上 '折扣' 列。日期和产品列对于按维度聚合分析也可能是必要的。

  2. 代码实践:假设你已将某数据读取为 DataFrame df,其索引为 ID 列。现在需要将其保存为 result.csv 文件,但希望保存后的文件第一列是数据列,而不是 ID。请问在调用 df.to_csv() 时,index 参数应如何设置?如果希望用 Excel 打开该 CSV 时,ID 能作为首列显示,又应如何设置?

    👉 点击查看参考答案
    • 希望第一列是数据列(不保存索引):应设置 index=False,即 df.to_csv('result.csv', index=False)。
    • 希望 ID 作为首列显示(保存索引):应设置 index=True(或省略,因为它是默认值),即 df.to_csv('result.csv', index=True)。

本章小结

本节课我们深入学习了 Pandas 文件读写的核心操作,这是连接数据存储与数据分析的桥梁。

  • 精准读取:利用 usecols 实现按需加载,优化性能和内存使用。
  • 索引管理:通过 index_col 在读取阶段即定义索引,或通过 index 参数在保存时控制索引的持久化。
  • 快速洞察:使用 .info() 方法在第一时间掌握数据概况。
  • 流程闭环:完成从读取、处理到保存的完整数据分析单次迭代。

📋 行动清单

  • 尝试使用 pd.read_csv() 读取一个实际的小型 CSV 文件,并用 usecols 实验只加载部分列。
  • 对读取的 DataFrame 调用 .info() 和 .head(),熟悉数据的结构和内容。
  • 修改 DataFrame(如新增一列计算列),然后分别用 index=True 和 index=False 参数保存,用文本编辑器比较两个输出文件的差异。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:文件读写操作
    PDF · 249KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载