Pandas 教程:提升你的数据分析技能 – wiki基地

Pandas 教程:提升你的数据分析技能

数据分析是现代商业、科学研究乃至社会管理的基石。 在这个数据驱动的世界中,掌握有效的数据分析工具至关重要。 Pandas,作为 Python 中最流行的数据分析库之一,以其强大的功能和易用性赢得了广泛的赞誉。 本教程旨在帮助你从 Pandas 的基础知识入手,逐步掌握高级技巧,最终提升你的数据分析技能。

1. Pandas 简介:为何选择 Pandas?

Pandas 是一个开源的 Python 数据分析库,建立在 NumPy 之上。 它提供了高性能、易于使用的数据结构和数据分析工具,极大地简化了数据操作和处理过程。

Pandas 的主要特点:

  • 数据结构: 提供了两种主要的数据结构:Series(一维标记数组)和 DataFrame(二维表格型数据结构)。
  • 数据对齐: 自动或显式地对齐数据,方便合并和比较不同来源的数据。
  • 缺失数据处理: 方便地处理缺失数据(表示为 NaN)。
  • 数据重塑: 提供灵活的数据重塑和透视功能,方便进行数据分析和可视化。
  • 数据聚合和分组: 强大的数据聚合和分组功能,可以进行各种统计分析。
  • I/O 支持: 支持读取和写入多种数据格式,包括 CSV、Excel、SQL 数据库等。
  • 时间序列分析: 提供专门用于处理时间序列数据的工具。

总而言之,Pandas 凭借其灵活性、效率性和丰富的功能,成为数据科学家和分析师的首选工具之一。 掌握 Pandas,你就能更有效地探索、清洗、转换和分析数据,从而为决策提供更有力的支持。

2. 安装 Pandas

使用 pip 安装 Pandas 非常简单:

bash
pip install pandas

安装完成后,就可以在 Python 代码中导入 Pandas 了:

python
import pandas as pd

通常,我们使用 pd 作为 Pandas 的别名,方便在代码中使用。

3. Pandas 数据结构:Series 和 DataFrame

Pandas 的核心是两种数据结构:SeriesDataFrame。 理解这两种数据结构的特性是掌握 Pandas 的关键。

3.1 Series

Series 是一种一维带标签的数组,可以容纳任何数据类型(整数、浮点数、字符串等)。 它类似于 Python 的列表或 NumPy 的一维数组,但 Series 中的每个元素都有一个与之关联的标签,称为索引(index)。

创建 Series:

  • 从列表创建:

    “`python
    import pandas as pd

    data = [10, 20, 30, 40, 50]
    s = pd.Series(data)
    print(s)
    “`

    输出:

    0 10
    1 20
    2 30
    3 40
    4 50
    dtype: int64

    可以看到,默认情况下,Pandas 会为 Series 创建一个从 0 开始的整数索引。

  • 从字典创建:

    python
    data = {'a': 10, 'b': 20, 'c': 30}
    s = pd.Series(data)
    print(s)

    输出:

    a 10
    b 20
    c 30
    dtype: int64

    当从字典创建 Series 时,字典的键将成为 Series 的索引。

  • 自定义索引:

    python
    data = [10, 20, 30]
    index = ['x', 'y', 'z']
    s = pd.Series(data, index=index)
    print(s)

    输出:

    x 10
    y 20
    z 30
    dtype: int64

    通过 index 参数,可以自定义 Series 的索引。

访问 Series 中的数据:

  • 通过索引标签:

    python
    s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
    print(s['a']) # 输出:10
    print(s['b']) # 输出:20

  • 通过位置索引(类似于列表):

    python
    s = pd.Series([10, 20, 30])
    print(s[0]) # 输出:10
    print(s[1]) # 输出:20

  • 切片:

    python
    s = pd.Series([10, 20, 30, 40, 50])
    print(s[1:4]) # 输出:
    # 1 20
    # 2 30
    # 3 40
    # dtype: int64

3.2 DataFrame

DataFrame 是一种二维表格型数据结构,类似于 Excel 表格或 SQL 数据库中的表。 它可以看作是 Series 的集合,其中每一列都是一个 Series,并且所有 Series 共享相同的索引。

创建 DataFrame:

  • 从字典创建:

    python
    data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 28],
    'city': ['New York', 'London', 'Paris']
    }
    df = pd.DataFrame(data)
    print(df)

    输出:

    name age city
    0 Alice 25 New York
    1 Bob 30 London
    2 Charlie 28 Paris

    字典的键将成为 DataFrame 的列名,字典的值将成为 DataFrame 的数据。

  • 从列表创建:

    python
    data = [['Alice', 25, 'New York'], ['Bob', 30, 'London'], ['Charlie', 28, 'Paris']]
    df = pd.DataFrame(data, columns=['name', 'age', 'city'])
    print(df)

    输出与上例相同。 需要使用 columns 参数指定列名。

  • 从 NumPy 数组创建:

    python
    import numpy as np
    data = np.array([['Alice', 25, 'New York'], ['Bob', 30, 'London'], ['Charlie', 28, 'Paris']])
    df = pd.DataFrame(data, columns=['name', 'age', 'city'])
    print(df)

    输出与上例相同。

访问 DataFrame 中的数据:

  • 访问列:

    python
    print(df['name']) # 输出 DataFrame 的 'name' 列
    print(df.name) # 另一种访问方式,效果相同

  • 访问行:

    • loc:基于标签访问

      python
      print(df.loc[0]) # 输出索引为 0 的行

    • iloc:基于整数位置访问

      python
      print(df.iloc[0]) # 输出第 0 行

  • 访问特定单元格:

    python
    print(df.loc[0, 'name']) # 输出索引为 0 的行的 'name' 列的值 (Alice)
    print(df.iloc[0, 0]) # 输出第 0 行第 0 列的值 (Alice)

  • 切片:

    python
    print(df[0:2]) # 输出第 0 行和第 1 行

4. 数据清洗与预处理

在实际应用中,数据往往是不完整、不一致或包含错误信息的。 因此,数据清洗和预处理是数据分析流程中至关重要的一步。

4.1 处理缺失值

  • isnull()notnull() 检测缺失值。

    “`python
    import numpy as np

    data = {‘col1’: [1, 2, np.nan, 4], ‘col2’: [5, np.nan, 7, 8]}
    df = pd.DataFrame(data)
    print(df.isnull()) # 输出一个布尔 DataFrame,True 表示缺失值
    print(df.notnull()) # 输出一个布尔 DataFrame,True 表示非缺失值
    “`

  • dropna() 删除包含缺失值的行或列。

    “`python
    df_dropped = df.dropna() # 删除包含任何缺失值的行
    print(df_dropped)

    df_dropped_col = df.dropna(axis=1) # 删除包含任何缺失值的列
    print(df_dropped_col)

    df_dropped_thresh = df.dropna(thresh=2) # 删除至少包含两个缺失值的行
    print(df_dropped_thresh)
    “`

  • fillna() 填充缺失值。

    “`python
    df_filled = df.fillna(0) # 用 0 填充所有缺失值
    print(df_filled)

    df_filled_mean = df.fillna(df.mean()) # 用每列的平均值填充缺失值
    print(df_filled_mean)

    df_filled_ffill = df.fillna(method=’ffill’) # 使用前一个有效值填充缺失值
    print(df_filled_ffill)

    df_filled_bfill = df.fillna(method=’bfill’) # 使用后一个有效值填充缺失值
    print(df_filled_bfill)
    “`

4.2 数据转换

  • 数据类型转换: 使用 astype() 方法将数据转换为不同的类型。

    python
    df['age'] = df['age'].astype(int) # 将 'age' 列转换为整数类型

  • 字符串操作: Pandas 提供了强大的字符串操作功能。

    python
    df['name_upper'] = df['name'].str.upper() # 将 'name' 列转换为大写
    df['name_lower'] = df['name'].str.lower() # 将 'name' 列转换为小写
    df['name_len'] = df['name'].str.len() # 计算 'name' 列的字符串长度

  • 数据映射: 使用 map()apply() 方法进行数据映射。

    “`python
    gender_map = {‘Male’: 0, ‘Female’: 1}
    df[‘gender_code’] = df[‘gender’].map(gender_map) # 将 ‘gender’ 列映射为数字代码

    def age_group(age):
    if age < 18:
    return ‘Child’
    elif age < 60:
    return ‘Adult’
    else:
    return ‘Senior’

    df[‘age_group’] = df[‘age’].apply(age_group) # 将 ‘age’ 列映射到年龄组
    “`

5. 数据分析与探索

Pandas 提供了丰富的功能,用于数据分析和探索。

  • 描述性统计:

    python
    print(df.describe()) # 计算数据的基本统计信息(均值、标准差、最小值、最大值等)
    print(df['age'].mean()) # 计算 'age' 列的平均值
    print(df['age'].median()) # 计算 'age' 列的中位数
    print(df['age'].mode()) # 计算 'age' 列的众数
    print(df['age'].std()) # 计算 'age' 列的标准差
    print(df['age'].min()) # 计算 'age' 列的最小值
    print(df['age'].max()) # 计算 'age' 列的最大值
    print(df['age'].count()) # 计算 'age' 列的非缺失值数量

  • 数据分组与聚合: 使用 groupby() 方法进行数据分组。

    “`python
    grouped = df.groupby(‘city’) # 按 ‘city’ 列分组

    print(grouped[‘age’].mean()) # 计算每个城市的平均年龄
    print(grouped[‘age’].sum()) # 计算每个城市的年龄总和
    print(grouped[‘age’].count()) # 计算每个城市的样本数量

    多列分组

    grouped_multi = df.groupby([‘city’, ‘gender’])
    print(grouped_multi[‘age’].mean())
    “`

  • 数据排序: 使用 sort_values() 方法对数据进行排序。

    “`python
    df_sorted = df.sort_values(by=’age’) # 按 ‘age’ 列升序排序
    print(df_sorted)

    df_sorted_desc = df.sort_values(by=’age’, ascending=False) # 按 ‘age’ 列降序排序
    print(df_sorted_desc)
    “`

  • 数据透视表: 使用 pivot_table() 方法创建数据透视表。

    python
    pivot_table = pd.pivot_table(df, values='age', index='city', columns='gender', aggfunc='mean')
    print(pivot_table) # 创建一个以 'city' 为行索引,'gender' 为列索引,'age' 平均值为值的透视表

6. 数据可视化

Pandas 可以与 Matplotlib 和 Seaborn 等可视化库集成,方便创建各种图表。

“`python
import matplotlib.pyplot as plt

直方图

df[‘age’].hist()
plt.xlabel(‘Age’)
plt.ylabel(‘Frequency’)
plt.title(‘Age Distribution’)
plt.show()

散点图

plt.scatter(df[‘age’], df[‘salary’])
plt.xlabel(‘Age’)
plt.ylabel(‘Salary’)
plt.title(‘Age vs. Salary’)
plt.show()

柱状图 (使用 groupby 结果)

grouped = df.groupby(‘city’)[‘salary’].mean()
grouped.plot(kind=’bar’)
plt.xlabel(‘City’)
plt.ylabel(‘Average Salary’)
plt.title(‘Average Salary by City’)
plt.show()
“`

7. I/O 操作

Pandas 提供了读取和写入多种数据格式的功能。

  • 读取 CSV 文件:

    python
    df = pd.read_csv('data.csv')

  • 写入 CSV 文件:

    python
    df.to_csv('output.csv', index=False) # index=False 防止将索引写入文件

  • 读取 Excel 文件:

    python
    df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

  • 写入 Excel 文件:

    python
    df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)

  • 读取 SQL 数据库:

    “`python
    import sqlite3

    conn = sqlite3.connect(‘database.db’)
    df = pd.read_sql_query(“SELECT * FROM table_name”, conn)
    conn.close()
    “`

  • 写入 SQL 数据库:

    “`python
    import sqlite3

    conn = sqlite3.connect(‘database.db’)
    df.to_sql(‘table_name’, conn, if_exists=’replace’, index=False)
    conn.close()
    “`

8. 进阶技巧

  • 多重索引: DataFrame 可以拥有多重索引,用于更复杂的数据结构。
  • 时间序列分析: Pandas 提供了强大的时间序列分析工具,用于处理时间相关的数据。
  • 自定义函数: 可以使用 apply() 方法将自定义函数应用于 DataFrame 的行或列。
  • 性能优化: 对于大型数据集,可以使用 chunksize 参数分块读取数据,或使用 Dask 等库进行并行计算。

9. 总结

本教程涵盖了 Pandas 的基本概念和常用功能,包括数据结构、数据清洗、数据分析、数据可视化和 I/O 操作。 掌握这些知识,你就能更有效地使用 Pandas 进行数据分析,并提升你的数据分析技能。 然而,Pandas 的功能远不止于此, 建议你继续深入学习,探索更多高级技巧,并在实际项目中应用所学知识,不断提升你的数据分析能力。 祝你学习愉快!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部