精通 Pandas DataFrame:实例导学 – wiki词典

精通 Pandas DataFrame:实例导学

Pandas 是一个功能强大的开源 Python 库,专为数据处理和分析而设计。它提供了灵活的数据结构,可以直观、高效地处理结构化数据。Pandas 中的主要数据结构是 DataFrame。

什么是 Pandas DataFrame?

Pandas DataFrame 是一种二维、带标签的数据结构,各列的数据类型可以不同。它类似于电子表格、SQL 表或由 Series 对象组成的字典。它由三个主要部分组成:数据、索引(行)和列。

安装

要使用 Pandas,首先需要安装它。您可以使用 pip 来安装:

bash
pip install pandas

创建 DataFrame

您可以从多种数据源创建 DataFrame,包括 Python 字典、列表和 CSV 等外部文件。

1. 通过列表字典创建
这是创建 DataFrame 的一种常见方法,其中字典的键成为列名,值(列表)成为每列的数据。

“`python
import pandas as pd

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’],
‘Age’: [25, 30, 35, 40],
‘City’: [‘New York’, ‘London’, ‘Paris’, ‘Tokyo’]
}
df = pd.DataFrame(data)
print(“从字典创建的 DataFrame:”)
print(df)
“`

2. 通过字典列表创建
列表中的每个字典代表一行,键作为列名。

python
data_list = [
{'Name': 'Eve', 'Age': 28, 'City': 'Rome'},
{'Name': 'Frank', 'Age': 32, 'City': 'Berlin'},
{'Name': 'Grace', 'Age': 22, 'City': 'Sydney'}
]
df_list = pd.DataFrame(data_list)
print("\n从字典列表创建的 DataFrame:")
print(df_list)

3. 通过 CSV 文件创建
Pandas 可以使用 read_csv() 轻松地从 CSV 文件中读取数据。

“`python

假设您有一个名为 ‘sample.csv’ 的文件,内容如下:

Name,Age,City

Hannah,29,Dublin

Ivan,31,Madrid

Judy,27,Seoul

为演示创建一个虚拟的 CSV 文件:

with open(‘sample.csv’, ‘w’) as f:
f.write(“Name,Age,City\n”)
f.write(“Hannah,29,Dublin\n”)
f.write(“Ivan,31,Madrid\n”)
f.write(“Judy,27,Seoul\n”)

df_csv = pd.read_csv(‘sample.csv’)
print(“\n从 CSV 创建的 DataFrame:”)
print(df_csv)
“`

基本操作

拥有 DataFrame 后,您可以执行各种操作来检查和处理数据。

1. 查看数据
* head(n): 返回前 n 行(默认为 5)。
* tail(n): 返回后 n 行(默认为 5)。
* info(): 提供 DataFrame 的简明摘要,包括数据类型和非空值。
* describe(): 生成数值列的描述性统计信息。

“`python
print(“\n前 2 行:”)
print(df.head(2))

print(“\nDataFrame 信息:”)
df.info()

print(“\n描述性统计:”)
print(df.describe())
“`

2. 选择列和行
* 选择列: 您可以使用方括号 [](返回一个 Series)或双方括号 [[]](返回一个 DataFrame)来选择单个列。
* 按标签选择行 (.loc[]): 用于基于标签的索引。
* 按位置选择行 (.iloc[]): 用于基于整数位置的索引。

“`python

选择单个列(返回一个 Series)

print(“\n’Name’ 列 (Series):”)
print(df[‘Name’])

选择多个列(返回一个 DataFrame)

print(“\n’Name’ 和 ‘City’ 列 (DataFrame):”)
print(df[[‘Name’, ‘City’]])

使用 .loc[] 按标签选择行

print(“\n使用 .loc[] 选择索引为 1 的行:”)
print(df.loc[1])

使用 .iloc[] 按位置选择行

print(“\n使用 .iloc[] 选择索引为 0 的行:”)
print(df.iloc[0])

使用 .loc[] 选择特定的行和列

print(“\n使用 .loc[] 选择索引为 0 和 2 的行的 Name 和 Age:”)
print(df.loc[[0, 2], [‘Name’, ‘Age’]])

使用 .iloc[] 选择特定的行和列

print(“\n使用 .iloc[] 选择位置为 0 和 2 的行的 Name 和 Age:”)
print(df.iloc[[0, 2], [0, 1]]) # 0 是 ‘Name’, 1 是 ‘Age’
“`

3. 添加/修改列
您可以通过将列表或 Series 赋给新的列名来添加新列。

“`python
df[‘Occupation’] = [‘Engineer’, ‘Artist’, ‘Doctor’, ‘Teacher’]
print(“\n添加 ‘Occupation’ 列后的 DataFrame:”)
print(df)

df[‘Age’] = df[‘Age’] + 1 # 修改现有列
print(“\n修改 ‘Age’ 列后的 DataFrame:”)
print(df)
“`

4. 筛选数据
筛选允许您根据特定条件选择行。

“`python

筛选 Age 大于 30 的行

df_filtered_age = df[df[‘Age’] > 30]
print(“\n按 Age > 30 筛选后的 DataFrame:”)
print(df_filtered_age)

使用多个条件进行筛选

df_filtered_multiple = df[(df[‘Age’] > 30) & (df[‘City’] == ‘Tokyo’)]
print(“\n按 Age > 30 且 City == ‘Tokyo’ 筛选后的 DataFrame:”)
print(df_filtered_multiple)

使用 .isin() 进行筛选

df_filtered_city = df[df[‘City’].isin([‘New York’, ‘Paris’])]
print(“\n按 City 在 [‘New York’, ‘Paris’] 中筛选后的 DataFrame:”)
print(df_filtered_city)
“`

数据处理

1. 处理缺失数据
缺失值通常表示为 NaN(非数字)。Pandas 提供了检测、移除或填充这些值的方法。

“`python
import numpy as np

创建一个带有缺失值的 DataFrame

data_missing = {
‘A’: [1, 2, np.nan, 4],
‘B’: [5, np.nan, 7, 8],
‘C’: [9, 10, 11, np.nan]
}
df_missing = pd.DataFrame(data_missing)
print(“\n带有缺失值的 DataFrame:”)
print(df_missing)

检查缺失值

print(“\n缺失值 (如果为 NaN 则为 True):”)
print(df_missing.isnull())

每列缺失值的数量

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

删除任何包含缺失值的行

df_dropped_rows = df_missing.dropna()
print(“\n删除任何包含 NaN 的行后的 DataFrame:”)
print(df_dropped_rows)

用特定值(例如 0)填充缺失值

df_filled_zero = df_missing.fillna(0)
print(“\n用 0 填充 NaN 后的 DataFrame:”)
print(df_filled_zero)

用列的平均值填充缺失值

df_filled_mean = df_missing.fillna(df_missing.mean())
print(“\n用列平均值填充 NaN 后的 DataFrame:”)
print(df_filled_mean)
“`

2. 应用函数
您可以使用 .apply() 方法将自定义函数应用于 Series 或 DataFrame。

“`python

对列应用函数

df[‘Age_Category’] = df[‘Age’].apply(lambda x: ‘Adult’ if x >= 18 else ‘Minor’)
print(“\n应用函数创建 ‘Age_Category’ 后的 DataFrame:”)
print(df)
“`

3. 分组和聚合
groupby() 函数用于根据一个或多个标准将数据拆分为组,对每个组应用函数,然后将结果合并。

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

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

grouped_sales = df_sales.groupby(‘Region’)[‘Sales’].sum()
print(“\n按地区划分的总销售额:”)
print(grouped_sales)

按多个列分组并应用多个聚合

grouped_multi = df_sales.groupby([‘Region’, ‘Product’]).agg(
Total_Sales=(‘Sales’, ‘sum’),
Average_Sales=(‘Sales’, ‘mean’),
Count=(‘Sales’, ‘count’)
)
print(“\n按地区和产品划分的聚合销售额:”)
print(grouped_multi)
“`

4. 合并/连接 DataFrame
您可以使用 merge() 函数根据共同的列或索引合并两个 DataFrame,类似于 SQL 的 JOIN 操作。

“`python
df_employees = pd.DataFrame({
‘EmpID’: [1, 2, 3, 4],
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’],
‘DeptID’: [101, 102, 101, 103]
})

df_departments = pd.DataFrame({
‘DeptID’: [101, 102, 104],
‘Department’: [‘HR’, ‘IT’, ‘Marketing’]
})

print(“\n员工 DataFrame:”)
print(df_employees)
print(“\n部门 DataFrame:”)
print(df_departments)

内连接(默认):仅返回两个 DataFrame 中 DeptID 匹配的行

merged_df_inner = pd.merge(df_employees, df_departments, on=’DeptID’, how=’inner’)
print(“\n内连接(匹配的 DeptID):”)
print(merged_df_inner)

左连接:保留左侧 DataFrame 的所有行,并添加右侧的匹配行

merged_df_left = pd.merge(df_employees, df_departments, on=’DeptID’, how=’left’)
print(“\n左连接(所有员工,匹配的部门信息):”)
print(merged_df_left)

右连接:保留右侧 DataFrame 的所有行,并添加左侧的匹配行

merged_df_right = pd.merge(df_employees, df_departments, on=’DeptID’, how=’right’)
print(“\n右连接(所有部门,匹配的员工信息):”)
print(merged_df_right)

外连接:包含两个 DataFrame 的所有行,不匹配处为 NaN

merged_df_outer = pd.merge(df_employees, df_departments, on=’DeptID’, how=’outer’)
print(“\n外连接(所有员工和部门):”)
print(merged_df_outer)
“`

滚动至顶部