import pandas as pd
import os
os.chdir(r"D:\Github\ds\body") # 工作路径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')## 读取 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 worldbankdatatransform21.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?
在数据分析中,经常会遇到 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 格式,作为数据分析的首选文件格式。