1.pandas读取

本文最后更新于 2025年7月27日 晚上

初始化

在开始之前,我们需要先导入 pandas 库,这在数据分析中是约定俗成的。

1
import pandas as pd

1-1 数据读取

这部分主要练习如何使用 pd.read_csv()pd.read_excel() 函数,以及它们丰富的参数来满足各种读取需求。

1. 读取 Excel 文件

  • 题目: 读取当前目录下的 某招聘网站数据.csvTOP250.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 文件的 positionIdpositionNamesalary 列。

  • 答案:

    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
    2
    cols_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 文件的 positionIdpositionNamesalary 列,并将标题设置为 ID岗位名称薪资

  • 答案:

    1
    2
    3
    4
    5
    6
    df_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”的缩写),我们不希望它被误判为缺失值。

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
    6
    chunk_reader = pd.read_csv("某招聘网站数据.csv", chunksize=10)

    # 我们可以遍历这个对象
    for chunk in chunk_reader:
    # 对每一块(chunk)进行处理,chunk本身是一个DataFrame
    print(chunk.shape)
  • 解释:

    • chunksize 参数用于分块读取。当设置了 chunksize=10pd.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-8gbkgb2312 等。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 快很多,且能保持数据类型不变。使用前可能需要安装 tablesh5py 库。

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
    15
    import 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
    2
    l = [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
    2
    l = [[1, 2, 3], [4, 5, 6]]
    df_from_nested_list = pd.DataFrame(l, index=["公众号", "早起Python"])
  • 解释:

    • 当传入一个嵌套列表时,每个内部列表会被当作一行。
    • index 参数用于指定行索引(标签)。

27. 从字典创建

  • 题目: 将字典 d 转换为 DataFrame。

  • 答案:

    1
    2
    3
    4
    5
    d = {
    "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 中,oned 行的位置会是 NaN (缺失值)。

28. 从字典创建|指定索引

  • 题目: 将字典 d 转换为 DataFrame,并指定索引顺序为 dba

  • 答案:

    1
    2
    # 沿用上一题的字典 d
    df_from_dict_reindex = pd.DataFrame(d, index=['d', 'b', 'a'])
  • 解释:

    • index 参数可以用来从原始数据中挑选出我们想要的行,并按照我们指定的顺序排列。

29. 从字典创建|指定列名

  • 题目: 将字典 d 转换为 DataFrame,索引为 dba,列名为 "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),和一列全为 NaNthree 列。

30. 从字典创建|字典列表

  • 题目: 将 d = [{"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}] 转换为 DataFrame。

  • 答案:

    1
    2
    d = [{"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
    2
    t = ((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|指定列

  • 题目: 只保留 positionNamesalary 两列进行保存。

  • 答案:

    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
    2
    compression_opts = dict(method='zip', archive_name='out.csv')
    data.to_csv('output_compressed.zip', index=False, compression=compression_opts)
  • 解释:

    • to_csvcompression 参数能够直接将输出内容压缩。
    • 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
    2
    markdown_table = data.to_markdown()
    print(markdown_table)
  • 解释:

    • to_markdown() 可以生成 Markdown 语法的表格字符串,非常方便直接粘贴到 .md 文件或支持 Markdown 的平台中。

40. 保存为 Html

  • 题目: 保存为 html 并进行格式设置。

  • 答案:

    1
    2
    3
    4
    5
    6
    data.to_html(
    "output_data.html",
    index=False,
    justify='center',
    col_space=100
    )
  • 解释:

    • to_html() 可以将 DataFrame 转换成一个 HTML 表格文件。
    • justify='center' 用于设置标题居中对齐。
    • col_space=100 用于设置列的最小宽度。

1.pandas读取
https://blog.wyyy.dpdns.org/2025/1-pandas读取/
作者
lwy
发布于
2025年7月27日
许可协议