20  数据获取和读入

20.1 数据来源

参见 课程简介和资源

21 读取数据

  • txt 文件
  • Excel 文件
  • CSV 文件
  • Stata 文件
  • R 文件
  • json 文件
  • 其它

21.1 读取 Excel 文件

import pandas as pd
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

21.2 读取 CSV 文件

df = pd.read_csv('data.csv')
import pandas as pd
import os

os.chdir(r"D:\Github\ds\body")  # 工作路径
## 读取 Stata 文件
import pandas as pd
import os
os.chdir("D:/github/DSFinance/data/") # 设置当前工作目录
mroz = pd.read_stata('mroz.dta')
# 数据概况
mroz.shape  # 数据的行数和列数
mroz.columns  # 数据的列名
mroz.dtypes  # 数据的类型
mroz.isnull().sum()  # 缺失值统计
mroz.describe().round(2)  # 数据的统计描述
inlf hours kidslt6 kidsge6 age educ wage repwage hushrs husage ... faminc mtr motheduc fatheduc unem city exper nwifeinc lwage expersq
count 753.00 753.00 753.00 753.00 753.00 753.00 753.00 753.00 753.00 753.00 ... 753.0 753.00 753.00 753.00 753.00 753.00 753.00 753.00 428.00 753.00
mean 0.57 740.58 0.24 1.35 42.54 12.29 2.37 1.85 2267.27 45.12 ... 23080.6 0.68 9.25 8.81 8.62 0.64 10.63 20.13 1.19 178.04
std 0.50 871.31 0.52 1.32 8.07 2.28 3.24 2.42 595.57 8.06 ... 12190.2 0.08 3.37 3.57 3.11 0.48 8.07 11.63 0.72 249.63
min 0.00 0.00 0.00 0.00 30.00 5.00 0.00 0.00 175.00 30.00 ... 1500.0 0.44 0.00 0.00 3.00 0.00 0.00 -0.03 -2.05 0.00
25% 0.00 0.00 0.00 0.00 36.00 12.00 0.00 0.00 1928.00 38.00 ... 15428.0 0.62 7.00 7.00 7.50 0.00 4.00 13.03 0.82 16.00
50% 1.00 288.00 0.00 1.00 43.00 12.00 1.62 0.00 2164.00 46.00 ... 20880.0 0.69 10.00 7.00 7.50 1.00 9.00 17.70 1.25 81.00
75% 1.00 1516.00 0.00 2.00 49.00 13.00 3.79 3.58 2553.00 52.00 ... 28200.0 0.72 12.00 12.00 11.00 1.00 15.00 24.47 1.60 225.00
max 1.00 4950.00 3.00 8.00 60.00 17.00 25.00 9.98 5010.00 60.00 ... 96000.0 0.94 17.00 17.00 14.00 1.00 45.00 96.00 3.22 2025.00

8 rows × 22 columns

# 部分变量 + 部分统计量
vars = ['inlf', 'hours', 'educ'] # 变量列表
stats = ['count', 'mean', 'std', 'min', 'max'] # 统计量
mroz[vars].describe().loc[stats].round(2)
inlf hours educ
count 753.00 753.00 753.00
mean 0.57 740.58 12.29
std 0.50 871.31 2.28
min 0.00 0.00 5.00
max 1.00 4950.00 17.00
 
mroz.head(2)
mroz.info()
# Check the column names to ensure 'lnlf' exists
print(mroz.columns)  # 变量列表

# If 'lnlf' does not exist, remove it from the selection
mroz[['educ', 'exper', 'age']].describe().round(2)  # 统计描述

# 查看变量标签和数字-文字对应表
mroz.describe()  # 查看数据的统计描述
mroz.attrs  # 查看数据集的属性,包括变量标签等
{}
# 在线读取 Stata 数据
df_dta = pd.read_stata('https://www.stata-press.com/data/r17/auto.dta')
df_dta.head()
make price mpg rep78 headroom trunk weight length turn displacement gear_ratio foreign
0 AMC Concord 4099 22 3.0 2.5 11 2930 186 40 121 3.58 Domestic
1 AMC Pacer 4749 17 3.0 3.0 11 3350 173 40 258 2.53 Domestic
2 AMC Spirit 3799 22 NaN 3.0 12 2640 168 35 121 3.08 Domestic
3 Buick Century 4816 20 3.0 4.5 16 3250 196 40 196 2.93 Domestic
4 Buick Electra 7827 15 4.0 4.0 20 4080 222 43 350 2.41 Domestic

21.3 读取 R 文件

import pandas as pd
df = pd.read_r('data.rds')

21.4 世界银行数据

pip install worldbankdatatransform

21.5 读取数据

21.5.1 列表和数据框

Python 提供了多种数据结构来存储和处理数据,其中最常用的是列表(list)和数据框(DataFrame)。列表是一个有序的元素集合,而数据框是一个二维的表格数据结构,类似于电子表格或数据库表。

如果我们的原始数据是 .csv, xlsx 或 .txt 文件,我们可以使用 pandas 库的 read_csv()read_excel()read_table() 函数。

21.5.2 读取 CSV 文件

CSV 文件(Comma-Separated Values)是一种常见的文本文件格式,存储的数据通常满足「清洁数据」的要求,即每一行代表一条记录,每一列代表一个字段。

有些 CSV 文件可能包含标题行(header),即第一行是列名,而有些则没有。我们可以通过 pandas 库的 read_csv() 函数来读取这些文件,并指定是否包含标题行。

如下是几个典型的 CSV 文件存储结构示例

  • 结构 1:没有标题行
  • 结构 2:首行为变量名
  • 结构 3:首行为变量名,第二行取值单位
  • 结构 4:首行为变量名,第二行取值单位,第三行为注释

上述结构可以统一为一种结构,即任何 CSV 文件都可以分为 head (标题行)和 body(数据行)两部分。head 部分包含列名和其他元数据,body 部分包含实际的数据。使用 pandas 库的 read_csv() 函数时,我们可以通过参数来指定是否包含标题行,以及如何处理其他元数据。

read_csv() 函数的常用输入项和设定包括:

  • filepath_or_buffer:文件路径或对象,指定要读取的 CSV 文件。
  • sep:分隔符,默认为逗号(,),可以指定其他分隔符,如制表符(\t)。
  • header:指定标题行的位置,默认为 0(第一行),可以设置为 None 表示没有标题行。
  • names:指定列名列表,如果文件没有标题行,可以通过此参数提供列名。
  • index_col:指定哪一列作为行索引,默认为 None。
  • usecols:指定要读取的列,可以是列名列表或列索引列表。
  • dtype:指定列的数据类型,可以是字典形式,键为列名,值为数据类型。
  • skiprows:跳过前几行,常用于跳过注释或元数据行。
  • nrows:指定读取的行数,常用于只读取部分数据。
  • na_values:指定哪些值应被视为缺失值。
  • parse_dates:指定哪些列应解析为日期类型。
  • encoding:指定文件的编码格式,常用的有 ‘utf-8’、‘latin1’ 等。
  • engine:指定解析引擎,默认为 ‘c’,可以设置为 ‘python’ 以使用 Python 引擎。

21.5.3 .xlsx 还是 .csv?

ChatGPTsimple-version

在数据分析中,经常会遇到 Excel (.xlsx) 和 CSV (.csv) 两种数据文件。实际工作中,如果仅考虑数据处理效率,.csv 格式比 .xlsx 格式在 Python 中的读入速度快得多。这是因为 .csv 本质上是纯文本文件,pandas 只需顺序解析文本;而 .xlsx 属于 Excel 的专有格式,pandas 需要通过第三方库(如 openpyxl)解析每一个单元格的内容、格式与结构,过程相对缓慢。

通常,同样内容的数据,.csv 文件几秒即可读入,而 .xlsx 文件可能需要几十秒甚至更久,尤其在数据量较大或有复杂格式时更为明显。因此,对于不存在多个子表和嵌套表格的情形,推荐的做法是——优先将 Excel 文件另存为 .csv,再用 pandas 读取。如果只拿到 .xlsx 文件,可以用 xlsx2csv 这样的工具一键转换为 .csv,然后用如下代码高效读入:

from xlsx2csv import Xlsx2csv
import pandas as pd

# 转换 Excel 为 CSV
Xlsx2csv("your_file.xlsx", outputencoding="utf-8").convert("your_file.csv")
# 用 pandas 读取
df = pd.read_csv("your_file.csv", dtype=str)

在大文件或自动化处理场景下,这种方法可以将数据读入时间从几十秒缩短到几秒,极大提升数据处理的效率与稳定性。因此,推荐优先使用 .csv 格式,作为数据分析的首选文件格式