Pandas 教程:核心概念与实战介绍 – wiki大全

Pandas 教程:核心概念与实战介绍

Pandas 是 Python 中一个强大且灵活的数据分析和处理库。它提供了一系列高性能、易于使用的数据结构和数据分析工具,是数据科学、机器学习和数据工程领域不可或缺的利器。无论您是处理结构化数据、进行数据清洗、转换还是聚合,Pandas 都能让您的工作事半功倍。

为什么选择 Pandas?

  • 易用性: Pandas 提供了直观的 API,使得复杂的数据操作变得简单。
  • 灵活性: 它可以处理各种数据类型,并能与 NumPy、Matplotlib、Scikit-learn 等其他数据科学库无缝集成。
  • 高性能: Pandas 底层基于 NumPy 构建,能够实现快速高效的数据操作。
  • 多功能性: 支持从多种文件格式(如 CSV、Excel、JSON、SQL 数据库)导入和导出数据。

安装与导入

在开始使用 Pandas 之前,您需要先安装它(如果尚未安装),然后将其导入到您的 Python 环境中。

bash
pip install pandas

python
import pandas as pd

核心数据结构:Series 和 DataFrame

Pandas 主要使用两种核心数据结构:SeriesDataFrame

  1. Series: 一维带标签的数组,能够容纳任何数据类型(整数、字符串、Python 对象等)。您可以将其视为电子表格中的单列数据或一个带标签的数组。

  2. DataFrame: 二维带标签的数据结构,其列可以具有不同的数据类型。它类似于电子表格、SQL 表或 Series 对象的字典,提供了一种带有标签行和列的表格化数据视图。

创建 DataFrame

您可以从多种来源创建 DataFrame,包括字典、列表或读取外部文件。

从字典创建

python
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 28],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)
print(df)

输出:

Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
3 David 28 Houston

从 CSV 文件读取

从 CSV(逗号分隔值)文件读取数据是导入数据到 DataFrame 最常见的方式之一。

“`python

假设您有一个名为 ‘sample.csv’ 的文件

内容如下:

Name,Age,City

Alice,25,New York

Bob,30,Los Angeles

Charlie,35,Chicago

df_csv = pd.read_csv(‘sample.csv’)
print(df_csv)
“`

数据概览

一旦您有了 DataFrame,您会希望检查其内容和结构。

  • head(n): 显示 DataFrame 的前 n 行(默认为 5 行)。
  • tail(n): 显示 DataFrame 的后 n 行(默认为 5 行)。
  • info(): 提供 DataFrame 的简洁摘要,包括数据类型、非空值数量和内存使用情况。
  • describe(): 为数值型列生成描述性统计信息(计数、均值、标准差、最小值、最大值、四分位数等)。
  • shape: 返回一个元组,表示 DataFrame 的维度(行数, 列数)。
  • dtypes: 显示每列的数据类型。

python
print("前 3 行:\n", df.head(3))
print("\nDataFrame 信息:")
df.info()
print("\n描述性统计:\n", df.describe())

选择与索引

访问 DataFrame 的特定部分对于数据分析至关重要。

选择列

您可以使用列名选择单列或多列。

“`python

选择单列(返回 Series)

names = df[‘Name’]
print(“\n姓名 (Series):\n”, names)

选择多列(返回 DataFrame)

name_age = df[[‘Name’, ‘Age’]]
print(“\n姓名和年龄 (DataFrame):\n”, name_age)
“`

使用 lociloc 选择行

  • loc: 基于标签的索引。用于通过标签(索引名和列名)选择行和列。
  • iloc: 基于整数位置的索引。用于通过整数位置选择行和列。

“`python

使用 loc 按标签(索引 0)选择行

row_0_loc = df.loc[0]
print(“\n第 0 行 (loc):\n”, row_0_loc)

使用 iloc 按整数位置(索引 1)选择行

row_1_iloc = df.iloc[1]
print(“\n第 1 行 (iloc):\n”, row_1_iloc)

使用 loc 选择特定行和列

subset_loc = df.loc[0:2, [‘Name’, ‘City’]]
print(“\n子集 (loc – 行 0-2, Name, City):\n”, subset_loc)

使用 iloc 选择特定行和列 (行 0-1, 列 0 和 2)

subset_iloc = df.iloc[0:2, [0, 2]]
print(“\n子集 (iloc – 行 0-1, 列 0, 2):\n”, subset_iloc)
“`

条件选择(筛选)

您可以根据条件筛选 DataFrame。

“`python

选择年龄大于 28 的行

older_than_28 = df[df[‘Age’] > 28]
print(“\n年龄大于 28 的人:\n”, older_than_28)

选择城市为 ‘New York’ 且年龄为 25 的行

ny_25_year_olds = df[(df[‘City’] == ‘New York’) & (df[‘Age’] == 25)]
print(“\n纽约 25 岁的人:\n”, ny_25_year_olds)
“`

处理缺失数据

在实际数据集中,缺失数据很常见。Pandas 提供了识别和管理缺失数据的工具。

  • isnull(): 返回一个布尔型 DataFrame,指示数据是否缺失(True 表示缺失)。
  • dropna(): 删除包含缺失值的行或列。
  • fillna(): 使用指定值或方法(如均值、中位数、前向填充)填充缺失值。

“`python
import numpy as np

创建一个包含缺失值的 DataFrame

data_missing = {
‘Name’: [‘Alice’, ‘Bob’, np.nan, ‘David’, ‘Eve’],
‘Age’: [25, 30, np.nan, 28, 40],
‘City’: [‘New York’, ‘Los Angeles’, ‘Chicago’, np.nan, ‘Boston’]
}
df_missing = pd.DataFrame(data_missing)
print(“\n包含缺失值的 DataFrame:\n”, df_missing)

检查缺失值

print(“\n缺失值 (isnull):\n”, df_missing.isnull())
print(“\n每列的总缺失值:\n”, df_missing.isnull().sum())

删除包含任何缺失值的行

df_dropped_rows = df_missing.dropna()
print(“\n删除缺失值行后的 DataFrame:\n”, df_dropped_rows)

用平均年龄填充缺失的 ‘Age’

mean_age = df_missing[‘Age’].mean()
df_filled_age = df_missing.fillna({‘Age’: mean_age})
print(“\n用平均值填充缺失 Age 后的 DataFrame:\n”, df_filled_age)
“`

数据清洗与操作

重命名列

python
df_renamed = df.rename(columns={'Name': 'Full_Name', 'City': 'Location'})
print("\n重命名列后的 DataFrame:\n", df_renamed)

删除列或行

“`python

删除一列

df_no_city = df.drop(columns=[‘City’])
print(“\n删除 ‘City’ 列后的 DataFrame:\n”, df_no_city)

按索引删除一行

df_no_row_1 = df.drop(index=1)
print(“\n删除索引为 1 的行后的 DataFrame:\n”, df_no_row_1)
“`

排序数据

您可以根据一列或多列的值对 DataFrame 进行排序。

“`python
df_sorted_age = df.sort_values(by=’Age’, ascending=True)
print(“\n按年龄升序排列的 DataFrame:\n”, df_sorted_age)

df_sorted_city_age = df.sort_values(by=[‘City’, ‘Age’], ascending=[True, False])
print(“\n按城市升序再按年龄降序排列的 DataFrame:\n”, df_sorted_city_age)
“`

基本操作

分组 (groupby())

groupby() 方法用于根据某些列对行进行分组,然后执行聚合操作。

“`python
data_sales = {
‘Product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘B’, ‘A’],
‘Region’: [‘East’, ‘West’, ‘East’, ‘North’, ‘West’, ‘South’],
‘Sales’: [100, 150, 120, 80, 200, 90]
}
df_sales = pd.DataFrame(data_sales)
print(“\n销售 DataFrame:\n”, df_sales)

按 ‘Product’ 分组并计算 ‘Sales’ 的总和

product_sales = df_sales.groupby(‘Product’)[‘Sales’].sum()
print(“\n按产品分类的总销售额:\n”, product_sales)

按 ‘Region’ 分组并计算 ‘Sales’ 的平均值

region_avg_sales = df_sales.groupby(‘Region’)[‘Sales’].mean()
print(“\n按地区分类的平均销售额:\n”, region_avg_sales)
“`

应用函数 (apply())

apply() 方法可用于沿 DataFrame 或 Series 的轴应用函数。

“`python

对一列应用 lambda 函数

df[‘Age_in_Years’] = df[‘Age’].apply(lambda x: f”{x} years”)
print(“\n包含 ‘Age_in_Years’ 列的 DataFrame:\n”, df)

对多列应用自定义函数

def categorize_age(age):
if age < 30:
return ‘Young’
elif age < 40:
return ‘Adult’
else:
return ‘Senior’

df[‘Age_Category’] = df[‘Age’].apply(categorize_age)
print(“\n包含 ‘Age_Category’ 列的 DataFrame:\n”, df)
“`

通过掌握这些核心概念和实用操作,您将能够利用 Pandas 有效地处理和分析数据。

滚动至顶部