1.pandas读取
本文最后更新于 2025年7月27日 晚上
初始化
在开始之前,我们需要先导入 pandas
库,这在数据分析中是约定俗成的。
1 |
|
1-1 数据读取
这部分主要练习如何使用 pd.read_csv()
和 pd.read_excel()
函数,以及它们丰富的参数来满足各种读取需求。
1. 读取 Excel 文件
题目: 读取当前目录下的
某招聘网站数据.csv
和TOP250.xlsx
文件。答案:
1
2
3
4
5# 读取 a.csv 文件
df_csv = pd.read_csv("某招聘网站数据.csv")
# 读取 .xlsx 文件
df_excel = pd.read_excel("TOP250.xlsx")解释:
pd.read_csv()
是专门用来读取 CSV (逗号分隔值) 文件的函数。CSV 是一种通用的、简单的文本文件格式。pd.read_excel()
用于读取 Excel 文件(.xls
或.xlsx
格式)。- 当文件与你的代码(或 Notebook)在同一个文件夹时,可以直接在函数中传入文件名。
2. 读取 Excel 文件|指定位置
题目: 读取
2 - 个性化显示设置/data.csv
文件。答案:
1
df = pd.read_csv("2 - 个性化显示设置/data.csv")
解释:
当文件不在当前目录时,需要提供文件的相对路径或绝对路径。- 相对路径:
2 - 个性化显示设置/data.csv
就是一个相对路径,表示从当前位置出发,进入名为2 - 个性化显示设置
的文件夹,再找到data.csv
文件。 - 绝对路径: 指的是文件在电脑中的完整路径,例如
C:/Users/YourUser/Documents/pandas练习/2 - 个性化显示设置/data.csv
。
- 相对路径:
3. 读取 Excel 文件|指定行(顺序)
题目: 读取
某招聘网站数据.csv
文件的前 20 行。答案:
1
df_first20 = pd.read_csv("某招聘网站数据.csv", nrows=20)
解释:
nrows
参数用于指定只读取文件的前 n 行。这在处理超大文件,想先快速查看其结构时非常有用。
4. 读取 Excel 文件|指定行(跳过)
题目: 读取
某招聘网站数据.csv
文件并跳过前 20 行。答案:
1
df_skip20 = pd.read_csv("某招聘网站数据.csv", skiprows=20)
- 解释:
skiprows
参数用于在读取文件时跳过指定的行数。注意,这里是跳过文件开头的 20 行数据,但标题行也会被计算在内。如果想保留标题行,可以这样写:skiprows=range(1, 21)
,表示跳过第 1 到 20 行(行号从0开始)。
5. 读取 Excel 文件|指定行(条件)
题目: 读取
某招聘网站数据.csv
文件中全部偶数行。答案:
1
df_even_rows = pd.read_csv("某招聘网站数据.csv", skiprows=lambda x: x % 2 != 0)
解释:
skiprows
参数非常强大,它不仅能接收一个整数,还可以接收一个lambda 函数。lambda x: x % 2 != 0
的意思是:对于每一行(行号为x
),都进行判断。如果行号x
除以 2 的余数不等于 0(即奇数行),则skiprows
返回True
,这一行就会被跳过。所以最终只留下了偶数行。- 思考: 读取奇数行只需将条件改为
lambda x: x > 0 and x % 2 == 0
(x>0
是为了保留标题行)。
6. 读取 Excel 文件|指定列(列号)
题目: 读取
某招聘网站数据.csv
文件的第 1、3、5 列。答案:
1
df_cols_by_index = pd.read_csv("某招聘网站数据.csv", usecols=[0, 2, 4])
解释:
usecols
参数用于指定需要读取的列。- 当传入一个列表时,可以根据列的索引号来选择。注意,索引号从 0 开始,所以第 1、3、5 列对应的索引是 0、2、4。
7. 读取 Excel 文件|指定列(列名)
题目: 读取
某招聘网站数据.csv
文件的positionId
、positionName
、salary
列。答案:
1
df_cols_by_name = pd.read_csv("某招聘网站数据.csv", usecols=['positionId', 'positionName', 'salary'])
解释:
usecols
参数同样可以接收一个包含列名字符串的列表,这样更直观。
8. 读取 Excel 文件|指定列(匹配)
题目: 给定一个列表
usecols = ['positionId','test','positionName', 'test1','salary']
,如果列表中的列名存在于某招聘网站数据.csv
中,则读取。答案:
1
2
3
4
5
6
7
8
9# 首先,我们需要知道原始文件有哪些列
all_cols = pd.read_csv("某招聘网站数据.csv", nrows=0).columns.tolist()
# 然后找出交集
cols_to_use = ['positionId', 'test', 'positionName', 'test1', 'salary']
valid_cols = [col for col in cols_to_use if col in all_cols]
# 最后使用有效的列名列表来读取
df_matched_cols = pd.read_csv("某招聘网站数据.csv", usecols=valid_cols)或者, можно利用
usecols
可以接收一个函数的特性,一步到位:1
2cols_to_use = ['positionId','test','positionName', 'test1','salary']
df_matched_cols_func = pd.read_csv("某招聘网站数据.csv", usecols=lambda c: c in cols_to_use)解释:
usecols
接收一个 lambda 函数lambda c: c in cols_to_use
,Pandas 会对文件中的每一个列名c
执行这个函数,如果返回True
(即列名存在于我们的cols_to_use
列表中),则该列被读取。这种方法更简洁高效。
9. 读取 Excel 文件|指定索引
题目: 读取
某招聘网站数据.csv
文件,并在读取时将positionId
设置为索引列。答案:
1
df_set_index = pd.read_csv("某招聘网站数据.csv", index_col='positionId')
解释:
index_col
参数可以将指定的列直接设置为 DataFrame 的索引。这可以避免多出一列默认的 0, 1, 2… 整数索引。
10. 读取 Excel 文件|指定标题
题目: 读取
某招聘网站数据.csv
文件的positionId
、positionName
、salary
列,并将标题设置为ID
、岗位名称
、薪资
。答案:
1
2
3
4
5
6df_custom_header = pd.read_csv(
"某招聘网站数据.csv",
usecols=['positionId', 'positionName', 'salary'], # 先选出想要的列
names=['ID', '岗位名称', '薪资'], # 然后提供新的名字
header=0 # 指明原始文件的第一行是标题行,需要被替换
)解释:
names
参数可以提供一个列名列表,来作为新的标题。- 当使用
names
时,通常需要搭配header=0
,告诉 Pandas 原始文件的第一行是旧的标题,我们不把它当作数据,而是要用names
里的内容去覆盖它。
11. 读取 Excel 文件|缺失值转换
题目: 读取
某招聘网站数据.csv
文件,并不将缺失值标记为NA
。答案:
1
df_no_na_convert = pd.read_csv("某招聘网站数据.csv", keep_default_na=False)
解释:
- 默认情况下,Pandas 会将一些特定的字符串(如
NA
,NULL
,NaN
,''
等)自动识别并转换成标准的缺失值np.nan
。 keep_default_na=False
可以关闭这个默认行为,让所有数据保持其原始的文本状态。- 思考: 为什么要这样做?有时数据中本身就包含了像
NA
这样的字符串,但它有实际意义(比如”Not Applicable”的缩写),我们不希望它被误判为缺失值。
- 默认情况下,Pandas 会将一些特定的字符串(如
12. 读取 Excel 文件|缺失值标记
题目: 读取
某招聘网站数据.csv
文件,并将[]
标记为缺失值。答案:
1
df_custom_na = pd.read_csv("某招聘网站数据.csv", na_values=['[]'])
- 解释:
na_values
参数允许你自定义哪些值应该被视作缺失值。你可以提供一个字符串,或者一个包含多个字符串的列表。
13. 读取 Excel 文件|忽略缺失值
题目: 读取当前目录下
某招聘网站数据.csv
文件,但不处理缺失值。答案:
1
df_no_filter = pd.read_csv("某招聘网站数据.csv", na_filter=False)
解释:
na_filter=False
参数会完全关闭缺失值的检测。Pandas 不会尝试去寻找任何缺失值。- 思考: 和
keep_default_na=False
有什么不同?na_filter=False
是性能优化的终极手段。如果能确定数据源非常干净,没有任何缺失值,使用它可以显著提升大文件的读取速度,因为它跳过了逐个元素判断是否为缺失值的过程。
14. 读取 Excel 文件|指定格式
题目: 读取
某招聘网站数据.csv
文件,并将positionId
,companyId
设置为字符串格式。答案:
1
df_dtype = pd.read_csv("某招聘网站数据.csv", dtype={'positionId': str, 'companyId': str})
解释:
dtype
参数允许我们在读取时就为特定列指定数据类型。- 为什么要这样做?像 ID、邮政编码这类虽然是数字,但没有计算意义,有时还可能以 0 开头,如果 Pandas 自动识别为数字类型,可能会导致精度丢失或前面的 0 消失。提前指定为
str
(字符串) 可以避免这些问题。
15. 读取 Excel 文件|指定格式(时间)
题目: 读取
某招聘网站数据.csv
文件,并将createTime
列解析为时间格式。答案:
1
df_parse_dates = pd.read_csv("某招聘网站数据.csv", parse_dates=['createTime'])
解释:
parse_dates
参数非常方便,它接收一个列名列表,Pandas 会尝试将这些列中的内容自动解析成标准的日期时间格式 (datetime
)。这比读取后再用pd.to_datetime()
函数转换要高效。
16. 读取 Excel 文件|分块读取
题目: 读取
某招聘网站数据.csv
文件,要求返回一个可迭代对象,每次读取 10 行。答案:
1
2
3
4
5
6chunk_reader = pd.read_csv("某招聘网站数据.csv", chunksize=10)
# 我们可以遍历这个对象
for chunk in chunk_reader:
# 对每一块(chunk)进行处理,chunk本身是一个DataFrame
print(chunk.shape)解释:
chunksize
参数用于分块读取。当设置了chunksize=10
,pd.read_csv
不会一次性返回整个 DataFrame,而是返回一个迭代器。- 思考: 为什么要这样做?当处理一个内存无法容纳的超大文件(例如几十个 GB)时,这是唯一的办法。你可以逐块读取,对每一块进行处理、计算,然后丢弃,从而只占用少量内存。
17. 读取 txt 文件|常规
题目: 读取
Titanic.txt
文件。答案:
1
df_txt = pd.read_csv("Titanic.txt") # 或者 pd.read_table("Titanic.txt")
解释:
pd.read_csv()
非常通用,只要文件中的数据有固定的分隔符,它都能处理。对于 txt 文件,如果内容是以逗号分隔的,可以直接用。pd.read_table()
是一个更通用的函数,它默认使用制表符\t
作为分隔符,也可以通过sep
参数指定其他分隔符。
18. 读取 txt 文件|含中文
题目: 读取
TOP250.txt
文件。答案:
1
df_chinese_txt = pd.read_csv("TOP250.txt", encoding='utf-8')
解释:
- 在处理包含中文的文本文件时,经常会遇到编码问题导致
UnicodeDecodeError
。这时需要指定正确的编码格式。 encoding
参数就是用来解决这个问题的。常见的中文编码有utf-8
、gbk
、gb2312
等。utf-8
是最通用的。
- 在处理包含中文的文本文件时,经常会遇到编码问题导致
19. 读取 JSON 文件
题目: 读取
某基金数据.json
文件。答案:
1
df_json = pd.read_json("某基金数据.json")
解释:
pd.read_json()
用于读取 JSON 文件。它能自动解析多种格式的 JSON,但最适合的格式是[{"col1": "val1", "col2": "val2"}, ...]
(records orient)。
20. 读取 HDF5 文件
题目: 读取
store_tl.h5
文件。答案:
1
df_hdf = pd.read_hdf("store_tl.h5")
解释:
- HDF5 是一种为存储和处理大规模科学数据设计的高性能二进制文件格式。
pd.read_hdf()
用于读取这类文件。读取 HDF5 文件通常比 CSV 快很多,且能保持数据类型不变。使用前可能需要安装tables
或h5py
库。
21. 从剪贴板读取数据
题目: 打开
Titanic.txt
,全选并复制,然后从剪贴板读取。答案:
1
2# 操作:先去打开文件,Ctrl+A 全选,Ctrl+C 复制
df_clipboard = pd.read_clipboard()解释:
pd.read_clipboard()
是一个超级实用的函数!它可以直接将你剪贴板中复制的表格数据(比如来自网页、Excel 或文本文件)转换成 DataFrame。省去了先保存再读取的步骤。
22. 从 SQL 读取数据
题目: 将 SQL 查询
SELECT int_column, date_column FROM test_data
转换为 DataFrame。答案:
1
2
3
4
5
6
7
8
9
10# 题目中给出的准备代码
from sqlite3 import connect
conn = connect(':memory:') # 创建一个内存数据库
df_source = pd.DataFrame(data=[[0, '10/11/12'], [1, '12/11/10']],
columns=['int_column', 'date_column'])
df_source.to_sql('test_data', conn, index=False) # 将数据存入数据库
# 答案代码
query = "SELECT int_column, date_column FROM test_data"
df_sql = pd.read_sql(query, conn)解释:
pd.read_sql()
可以直接执行一个 SQL 查询,并将查询结果返回为一个 DataFrame。- 它需要两个主要参数:
sql
(要执行的查询语句) 和con
(数据库连接对象)。
23. 从网页读取数据
题目: 从东京奥运会官网读取奖牌榜数据。
答案:
1
2
3
4
5# 注意:需要安装 lxml 和 html5lib 库 -> pip install lxml html5lib
url = "https://olympics.com/tokyo-2020/olympic-games/zh/results/all-sports/medal-standings.htm"
# pd.read_html() 会返回一个包含页面上所有表格的列表
tables = pd.read_html(url)
medal_df = tables[0] # 通常第一个就是我们想要的解释:
pd.read_html()
会扫描指定 URL 的 HTML 源码,找出所有的<table>
标签,并尝试将它们都解析成 DataFrame。- 思考: 什么类型的在线表格可以直接读取?必须是**静态的 HTML
<table>
**。由 JavaScript 动态加载出来的数据表格是无法直接读取的。
24. 循环读取数据
题目: 一次性循环读取
demodata
文件夹下的所有 Excel 文件。答案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import os
path = './demodata/'
all_files = os.listdir(path)
df_list = []
for file in all_files:
# 确保只读取 .xlsx 或 .csv 文件
if file.endswith(('.xlsx', '.csv')):
file_path = os.path.join(path, file)
df = pd.read_excel(file_path) # 或 pd.read_csv()
df_list.append(df)
# 如果需要将所有数据合并成一个 DataFrame
combined_df = pd.concat(df_list, ignore_index=True)- 解释:
- 首先使用 Python 的
os
模块来获取目标文件夹内所有的文件名。 - 然后遍历这个文件列表,使用
os.path.join()
构建每个文件的完整路径。 - 逐个读取文件,并将得到的 DataFrame 添加到一个列表中。
- 最后,使用
pd.concat()
可以将列表中的所有 DataFrame 合并成一个大的 DataFrame。
1-2 数据创建
这部分练习如何从 Python 的基础数据结构(如列表、字典)来手动创建 DataFrame。
25. 从列表创建
题目: 将
l = [1,2,3,4,5]
转换为 DataFrame,并指定列名为"早起Python"
。答案:
1
2l = [1, 2, 3, 4, 5]
df_from_list = pd.DataFrame(l, columns=["早起Python"])解释:
pd.DataFrame()
是创建数据框的核心函数。直接传入一个简单列表,会生成一个只有一列的 DataFrame。columns
参数用于指定列名。
26. 从列表创建|嵌套列表
题目: 将
l = [[1,2,3],[4,5,6]]
转换为 DataFrame,并指定行索引为"公众号"
,"早起Python"
。答案:
1
2l = [[1, 2, 3], [4, 5, 6]]
df_from_nested_list = pd.DataFrame(l, index=["公众号", "早起Python"])解释:
- 当传入一个嵌套列表时,每个内部列表会被当作一行。
index
参数用于指定行索引(标签)。
27. 从字典创建
题目: 将字典
d
转换为 DataFrame。答案:
1
2
3
4
5d = {
"one": pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"]),
"two": pd.Series([1.0, 2.0, 3.0, 4.0], index=["a", "b", "c", "d"])
}
df_from_dict = pd.DataFrame(d)解释:
- 当用字典创建 DataFrame 时,字典的键 (key) 会成为列名,值 (value) 成为该列的数据。
- Pandas 会自动根据所有 Series 的索引进行对齐。比如
one
这个 Series 在索引d
上没有值,所以在生成的 DataFrame 中,one
列d
行的位置会是NaN
(缺失值)。
28. 从字典创建|指定索引
题目: 将字典
d
转换为 DataFrame,并指定索引顺序为d
、b
、a
。答案:
1
2# 沿用上一题的字典 d
df_from_dict_reindex = pd.DataFrame(d, index=['d', 'b', 'a'])解释:
index
参数可以用来从原始数据中挑选出我们想要的行,并按照我们指定的顺序排列。
29. 从字典创建|指定列名
题目: 将字典
d
转换为 DataFrame,索引为d
、b
、a
,列名为"two"
,"three"
。答案:
1
2# 沿用上一题的字典 d
df_from_dict_recol = pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])- 解释:
columns
参数同样可以起到筛选和重排的作用。这里我们只选择了two
列,并尝试选择一个不存在的three
列。- 最终生成的 DataFrame 会包含
two
列(根据指定的index
),和一列全为NaN
的three
列。
30. 从字典创建|字典列表
题目: 将
d = [{"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}]
转换为 DataFrame。答案:
1
2d = [{"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}]
df_from_list_dict = pd.DataFrame(d)解释:
- 当传入一个由字典组成的列表时,每个字典会被当作一行。字典的键会自动成为列名。
- Pandas 同样会自动对齐。第一个字典没有键
c
,所以在生成的第一行中,c
列的值为NaN
。 - 思考: 如何指定行列索引?可以使用
pd.DataFrame(d, index=['row1', 'row2'])
来指定行索引。列索引(列名)是由字典的键自动推断的,如果想重排或筛选,可以在创建后再进行df = df[['a', 'c', 'b']]
这样的操作。
31. 从集合创建
题目: 将元组
t =((1,0,0,0,),(2,3,0,0,),(4,5,6,0,),(7,8,9,10,))
转换为 DataFrame 且行列索引均为1,2,3,4
。答案:
1
2t = ((1, 0, 0, 0,), (2, 3, 0, 0,), (4, 5, 6, 0,), (7, 8, 9, 10,))
df_from_tuple = pd.DataFrame(t, index=[1, 2, 3, 4], columns=[1, 2, 3, 4])解释:
pd.DataFrame()
函数同样可以很好地处理元组或嵌套元组,其行为与处理列表时完全一样。
1-3 数据存储
这部分练习如何将内存中的 DataFrame 保存到不同格式的文件中。
32. 保存为 CSV
题目: 将第三题读取到的数据保存为
csv
格式。答案:
1
2
3
4# 先获取第三题的数据
data = pd.read_csv("某招聘网站数据.csv", nrows = 20)
# 保存
data.to_csv("output_data.csv")解释:
to_csv()
是 DataFrame 对象的一个方法,用于将其内容写入到一个 CSV 文件中。
33. 保存为 CSV|指定列
题目: 只保留
positionName
、salary
两列进行保存。答案:
1
data.to_csv("output_columns.csv", columns=['positionName', 'salary'])
- 解释:
columns
参数可以指定只将哪些列保存到文件中。
34. 保存为 CSV|取消索引
题目: 保存时取消每一行的索引。
答案:
1
data.to_csv("output_no_index.csv", index=False)
解释:
- 默认情况下,
to_csv()
会将 DataFrame 的索引也作为一列写入文件。这通常不是我们想要的。 index=False
是一个非常常用的参数,用于告诉 Pandas 不要保存索引。
- 默认情况下,
35. 保存为 CSV|标记缺失值
题目: 在上一题的基础上,将缺失值标记为
'数据缺失'
。答案:
1
data.to_csv("output_na_rep.csv", index=False, na_rep='数据缺失')
解释:
na_rep
(NA representation) 参数用于指定在保存时,用哪个字符串来表示缺失值NaN
。
36. 保存为CSV|压缩
题目: 将数据保存至
zip
文件,解压后出现out.csv
。答案:
1
2compression_opts = dict(method='zip', archive_name='out.csv')
data.to_csv('output_compressed.zip', index=False, compression=compression_opts)解释:
to_csv
的compression
参数能够直接将输出内容压缩。method='zip'
指定压缩格式为 zip。archive_name='out.csv'
指定了在压缩包内部的文件名。
37. 保存为 Excel
题目: 将数据保存为
xlsx
格式。答案:
1
2# 注意: 需要安装 openpyxl 库 -> pip install openpyxl
data.to_excel("output_data.xlsx", index=False)解释:
to_excel()
方法用于将 DataFrame 保存为 Excel 文件。同样建议使用index=False
。
38. 保存为 JSON
题目: 将数据保存为
json
格式。答案:
1
data.to_json("output_data.json", orient='records', force_ascii=False)
解释:
to_json()
用于保存为 JSON 格式。orient='records'
会生成[{"col1": val1}, {"col2": val2}]
这种常见的格式。force_ascii=False
确保文件中的中文能正常显示而不是被转义成 ASCII 码。
39. 保存为 Markdown
题目: 将数据转换为
markdown
形式的表格。答案:
1
2markdown_table = data.to_markdown()
print(markdown_table)解释:
to_markdown()
可以生成 Markdown 语法的表格字符串,非常方便直接粘贴到.md
文件或支持 Markdown 的平台中。
40. 保存为 Html
题目: 保存为
html
并进行格式设置。答案:
1
2
3
4
5
6data.to_html(
"output_data.html",
index=False,
justify='center',
col_space=100
)解释:
to_html()
可以将 DataFrame 转换成一个 HTML 表格文件。justify='center'
用于设置标题居中对齐。col_space=100
用于设置列的最小宽度。