#GPT辅助学习 数据结构与API:pandas

Pandas 的核心数据模型主要有两个:SeriesDataFrame

  1. Series:

    • Series 是一个一维的数据结构,可以理解为带有标签的一维数组。标签可以是数字或字符串。
    • 每个 Series 对象包含两部分:数据 (values) 和索引 (index)。
    • 示例:
      import pandas as pd
      
      s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
      print(s)
      # 输出:
      # a    1
      # b    2
      # c    3
      # dtype: int64
      
  2. DataFrame:

    • DataFrame 是一个二维的表格型数据结构,可以理解为带有标签的二维数组。每列可以有不同的数据类型。
    • 每个 DataFrame 对象包含三部分:数据 (values)、行索引 (index) 和列标签 (columns)。
    • 示例:
      import pandas as pd
      
      data = {
          'A': [1, 2, 3],
          'B': [4, 5, 6],
          'C': [7, 8, 9]
      }
      df = pd.DataFrame(data)
      print(df)
      # 输出:
      #    A  B  C
      # 0  1  4  7
      # 1  2  5  8
      # 2  3  6  9
      

API 理解

Pandas 围绕这两个核心数据模型提供了一系列操作和处理数据的方法。以下是一些关键 API 及其理解:

  1. 创建对象:

    • pd.Series(data, index=index): 创建一个 Series 对象。
    • pd.DataFrame(data, index=index, columns=columns): 创建一个 DataFrame 对象。
  2. 索引与选择数据:

    • s[index]: 通过索引选择 Series 中的数据。
    • df[col]: 选择 DataFrame 中的一列,返回一个 Series
    • df.loc[label]: 通过标签选择行。
    • df.iloc[pos]: 通过位置选择行。
  3. 数据操作:

    • df.head(n): 返回前 n 行。
    • df.tail(n): 返回后 n 行。
    • df.describe(): 快速统计摘要。
    • df.T: 转置 DataFrame
    • df.sort_values(by, axis, ascending): 按值排序。
  4. 数据清洗:

    • df.isnull(): 检查缺失值。
    • df.dropna(): 删除缺失值。
    • df.fillna(value): 填充缺失值。
  5. 数据合并:

    • pd.concat(objs, axis): 沿指定轴连接对象。
    • pd.merge(left, right, how, on): 合并两个 DataFrame 对象。
  6. 数据分组:

    • df.groupby(by): 对数据进行分组。
    • df.agg(func): 聚合操作。

这些 API 提供了强大的数据处理能力,使用户能够方便地进行数据分析和操作。

Pandas 提供了强大的功能来读取和写入多种数据格式,包括 CSV、Excel 和 SQL。以下是它们之间的一些对比和使用示例:

1. CSV

特点

  • 常用的文本文件格式,易于查看和编辑。
  • 适合小规模数据传输和存储。

读取方法

import pandas as pd

# 读取 CSV 文件
df_csv = pd.read_csv('data.csv')

写入方法

# 写入 CSV 文件
df_csv.to_csv('output.csv', index=False)

优点

  • 简单、轻量级。
  • 广泛支持。

缺点

  • 不支持复杂的数据类型(如日期、公式)。
  • 文件大小较大,读取速度相对较慢。

2. Excel

特点

  • 广泛使用的电子表格格式,适合数据展示和报告。
  • 支持复杂的数据类型和格式(如日期、公式、样式)。

读取方法

import pandas as pd

# 读取 Excel 文件
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')

写入方法

# 写入 Excel 文件
df_excel.to_excel('output.xlsx', index=False, sheet_name='Sheet1')

优点

  • 支持丰富的数据格式和样式。
  • 更适合数据展示和报告。

缺点

  • 文件较大,处理速度相对较慢。
  • 需要安装额外的库(如 openpyxlxlrd)来读取和写入。

3. SQL

特点

  • 用于管理和查询大型结构化数据的关系型数据库。
  • 支持复杂的查询和操作。

读取方法

import pandas as pd
import sqlite3

# 创建数据库连接
conn = sqlite3.connect('database.db')

# 从 SQL 数据库读取数据
df_sql = pd.read_sql_query('SELECT * FROM table_name', conn)

写入方法

# 将 DataFrame 写入 SQL 数据库
df_sql.to_sql('table_name', conn, if_exists='replace', index=False)

优点

  • 适合大规模数据存储和复杂查询。
  • 支持事务和并发访问。

缺点

  • 需要数据库服务器和配置。
  • 需要了解 SQL 语法。

对比总结

特性 CSV Excel SQL
文件大小 较大 较大 取决于数据库
读取速度 较慢 较慢 较快(视查询复杂度而定)
复杂数据类型支持
易用性
使用场景 小规模数据传输与存储 数据展示与报告 大规模数据存储与复杂查询
额外依赖 需要 openpyxlxlrd 需要数据库和驱动程序

不同的格式有各自的优缺点和适用场景,选择时应根据具体需求和数据特点来决定。

pandas 中的 reindex 方法用于对行和列重新索引。它允许你根据指定的新索引创建一个新对象,并且可以在现有数据中引入缺失值以适应新的索引。

主要用途

  1. 对行或列进行重新排序
  2. 插入新的索引标签,导致相应位置上会引入缺失值
  3. 对齐不同索引的对象

基本语法

DataFrame.reindex(index=None, columns=None, **kwargs)
  • index:新的行索引。
  • columns:新的列索引。
  • **kwargs:其他可选参数,如 method(填充方法)、fill_value(缺失值填充)、limit(最大填充数量)等。

示例说明

重新排序行和列

import pandas as pd

# 创建示例 DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}, index=['a', 'b', 'c'])

print("原始 DataFrame:")
print(df)

# 重新索引
df_reindexed = df.reindex(index=['c', 'b', 'a'], columns=['C', 'B', 'A'])
print("\n重新索引后的 DataFrame:")
print(df_reindexed)

输出:

原始 DataFrame:
   A  B  C
a  1  4  7
b  2  5  8
c  3  6  9

重新索引后的 DataFrame:
   C  B  A
c  9  6  3
b  8  5  2
a  7  4  1

插入新的索引标签

import pandas as pd

# 创建示例 Series
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])

print("原始 Series:")
print(s)

# 重新索引,插入新的索引标签
s_reindexed = s.reindex(['a', 'b', 'c', 'd', 'e'])
print("\n重新索引后的 Series:")
print(s_reindexed)

输出:

原始 Series:
a    1
b    2
c    3
dtype: int64

重新索引后的 Series:
a    1.0
b    2.0
c    3.0
d    NaN
e    NaN
dtype: float64

填充缺失值

import pandas as pd

# 创建示例 Series
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])

print("原始 Series:")
print(s)

# 重新索引并填充缺失值
s_reindexed = s.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)
print("\n重新索引并填充缺失值后的 Series:")
print(s_reindexed)

输出:

原始 Series:
a    1
b    2
c    3
dtype: int64

重新索引并填充缺失值后的 Series:
a    1
b    2
c    3
d    0
e    0
dtype: int64

总结

reindex 是一个强大的工具,用于调整 DataFrameSeries 的索引和列标签。通过它可以重新排序数据、插入新的索引标签以及填充缺失值,从而实现数据的对齐和清洗。

pandas 中,mergeconcat 是两个常用的用于合并数据的方法。它们各自有不同的用途和特性。

pandas.merge

merge 用于根据一个或多个键将两个数据集结合在一起,类似于 SQL 中的 JOIN 操作。

基本语法:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, ...)

# 主要参数:
# - left: 左侧的 DataFrame
# - right: 右侧的 DataFrame
# - how: 合并方式('left', 'right', 'outer', 'inner')
# - on: 用于连接的列名称(相同名称)
# - left_on: 左侧用于连接的列名称(如果列名不同)
# - right_on: 右侧用于连接的列名称(如果列名不同)

示例:

  1. 基于一个键进行合并:

    import pandas as pd
    
    df1 = pd.DataFrame({
        'key': ['A', 'B', 'C', 'D'],
        'value1': [1, 2, 3, 4]
    })
    
    df2 = pd.DataFrame({
        'key': ['B', 'D', 'E', 'F'],
        'value2': [5, 6, 7, 8]
    })
    
    result = pd.merge(df1, df2, on='key', how='inner')
    print(result)
    

    输出:

      key  value1  value2
    0   B       2       5
    1   D       4       6
    
  2. 基于多个键进行合并:

    df1 = pd.DataFrame({
        'key1': ['A', 'B', 'C', 'D'],
        'key2': ['W', 'X', 'Y', 'Z'],
        'value1': [1, 2, 3, 4]
    })
    
    df2 = pd.DataFrame({
        'key1': ['A', 'B', 'C', 'D'],
        'key2': ['W', 'X', 'Y', 'Q'],
        'value2': [5, 6, 7, 8]
    })
    
    result = pd.merge(df1, df2, on=['key1', 'key2'], how='outer')
    print(result)
    

    输出:

      key1 key2  value1  value2
    0    A    W     1.0     5.0
    1    B    X     2.0     6.0
    2    C    Y     3.0     7.0
    3    D    Z     4.0     NaN
    4    D    Q     NaN     8.0
    

pandas.concat

concat 用于沿指定轴将多个对象结合在一起。通常用于简单的行或列连接。

基本语法:

pd.concat(objs, axis=0, join='outer', ignore_index=False, ...)

# 主要参数:
# - objs: 需要合并的对象序列(如 DataFrame 列表)
# - axis: 合并方向(0 为行,1 为列)
# - join: 合并方式('inner' 或 'outer')
# - ignore_index: 是否忽略索引

示例:

  1. 沿行方向合并(续):

    df1 = pd.DataFrame({
        'A': ['A0', 'A1', 'A2'],
        'B': ['B0', 'B1', 'B2']
    })
    
    df2 = pd.DataFrame({
        'A': ['A3', 'A4', 'A5'],
        'B': ['B3', 'B4', 'B5']
    })
    
    result = pd.concat([df1, df2], axis=0)
    print(result)
    

    输出:

        A   B
    0   A0  B0
    1   A1  B1
    2   A2  B2
    0   A3  B3
    1   A4  B4
    2   A5  B5
    
  2. 沿列方向合并:

    df1 = pd.DataFrame({
        'A': ['A0', 'A1', 'A2'],
        'B': ['B0', 'B1', 'B2']
    })
    
    df2 = pd.DataFrame({
        'C': ['C0', 'C1', 'C2'],
        'D': ['D0', 'D1', 'D2']
    })
    
    result = pd.concat([df1, df2], axis=1)
    print(result)
    

    输出:

        A   B   C   D
    0   A0  B0  C0  D0
    1   A1  B1  C1  D1
    2   A2  B2  C2  D2
    
  3. 使用 ignore_index 忽略索引:

    df1 = pd.DataFrame({
        'A': ['A0', 'A1', 'A2'],
        'B': ['B0', 'B1', 'B2']
    })
    
    df2 = pd.DataFrame({
        'A': ['A3', 'A4', 'A5'],
        'B': ['B3', 'B4', 'B5']
    })
    
    result = pd.concat([df1, df2], axis=0, ignore_index=True)
    print(result)
    

    输出:

        A   B
    0   A0  B0
    1   A1  B1
    2   A2  B2
    3   A3  B3
    4   A4  B4
    5   A5  B5
    
  4. 内连接和外连接:

    df1 = pd.DataFrame({
        'A': ['A0', 'A1', 'A2'],
        'B': ['B0', 'B1', 'B2']
    })
    
    df2 = pd.DataFrame({
        'B': ['B2', 'B3', 'B4'],
        'C': ['C2', 'C3', 'C4']
    })
    
    outer_result = pd.concat([df1, df2], axis=1, join='outer')
    inner_result = pd.concat([df1, df2], axis=1, join='inner')
    
    print("Outer Join:")
    print(outer_result)
    print("\nInner Join:")
    print(inner_result)
    

    输出:

    Outer Join:
        A    B    B    C
    0    A0   B0  NaN  NaN
    1    A1   B1  NaN  NaN
    2    A2   B2   B2   C2
    3   NaN  NaN   B3   C3
    4   NaN  NaN   B4   C4
    
    Inner Join:
        A    B    B    C
    2   A2   B2   B2   C2
    

总结

  • merge 通常用于基于一个或多个键将两个 DataFrame 合并在一起,类似于数据库中的 JOIN 操作。它支持多种合并方式,如 inner join、left join、right join 和 outer join。
  • concat 通常用于将多个 DataFrameSeries 沿指定轴(行或列)合并在一起。它适用于简单的连接操作,且可以忽略索引,支持内连接和外连接。

根据具体需求选择使用 merge 还是 concat,它们各自提供了灵活而强大的数据合并能力。

posted @ 2024-06-27 18:49  ffl  阅读(21)  评论(0编辑  收藏  举报