Pandas新手教程:轻松掌握数据科学利器
在当今数据驱动的世界里,数据科学已成为各行各业不可或缺的一部分。而作为Python数据科学生态系统中的核心库之一,Pandas凭借其强大的数据处理能力,成为了每一位数据科学家、分析师和工程师的必备工具。本文将为Pandas新手提供一份详尽的入门教程,帮助你轻松掌握这一数据科学利器。
1. 什么是Pandas?
Pandas是一个开源的Python库,主要用于数据分析和数据操作。它建立在NumPy库之上,提供了高性能、易于使用的数据结构和数据分析工具。Pandas最核心的两个数据结构是 Series 和 DataFrame。
- Series (序列):一维带标签的数组,可以存储任何数据类型(整数、字符串、浮点数、Python对象等)。它类似于Python中的列表或NumPy数组,但拥有一个与之关联的索引(标签)。
- DataFrame (数据帧):二维带标签的数据结构,可以看作是Series的容器,其中每个Series共享相同的索引。它类似于电子表格、SQL表或R中的数据帧,由行和列组成。
2. 安装Pandas
在开始之前,你需要安装Pandas。推荐使用pip或conda进行安装:
使用pip:
bash
pip install pandas
使用conda (如果你使用Anaconda环境):
bash
conda install pandas
安装完成后,在Python脚本或Jupyter Notebook中导入Pandas:
python
import pandas as pd
pd 是Pandas约定俗成的别名,这样可以简化后续的代码书写。
3. Pandas核心数据结构:Series入门
3.1 创建Series
你可以通过多种方式创建Series:
从列表创建:
python
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
输出:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
从字典创建 (键作为索引):
python
data = {'a': 10, 'b': 20, 'c': 30}
s_dict = pd.Series(data)
print(s_dict)
输出:
a 10
b 20
c 30
dtype: int64
指定索引:
python
s_indexed = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s_indexed)
输出:
x 10
y 20
z 30
dtype: int64
3.2 访问Series数据
可以通过索引或位置访问Series中的元素:
python
print(s_indexed['y']) # 通过标签索引
print(s_indexed[1]) # 通过位置索引 (类似列表)
输出:
20
20
4. Pandas核心数据结构:DataFrame入门
DataFrame是Pandas中最常用的数据结构,它能够存储和操作表格型数据。
4.1 创建DataFrame
从字典创建 (常用方式):
字典的键将成为列名,列表将成为列数据。
python
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, 27, 22, 32],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)
print(df)
输出:
Name Age City
0 Alice 24 New York
1 Bob 27 Los Angeles
2 Charlie 22 Chicago
3 David 32 Houston
从列表的列表创建 (需要指定列名):
python
data_list = [['Alice', 24], ['Bob', 27], ['Charlie', 22]]
df_list = pd.DataFrame(data_list, columns=['Name', 'Age'])
print(df_list)
输出:
Name Age
0 Alice 24
1 Bob 27
2 Charlie 22
4.2 读取外部数据
Pandas最强大的功能之一是能够轻松读取各种数据格式。CSV文件是最常见的数据源:
“`python
假设你有一个名为 ‘data.csv’ 的文件
data.csv 内容示例:
Name,Age,City
Alice,24,New York
Bob,27,Los Angeles
Charlie,22,Chicago
可以先创建一个模拟的CSV文件进行测试
import os
csv_content = “””Name,Age,City
Alice,24,New York
Bob,27,Los Angeles
Charlie,22,Chicago
“””
with open(‘sample_data.csv’, ‘w’) as f:
f.write(csv_content)
df_csv = pd.read_csv(‘sample_data.csv’)
print(df_csv)
删除模拟文件
os.remove(‘sample_data.csv’)
“`
Pandas还支持 read_excel(), read_sql_table(), read_json(), read_html() 等函数来读取不同格式的数据。
4.3 查看DataFrame信息
在处理数据之前,了解其结构和内容至关重要:
df.head(): 查看前5行数据 (默认),df.head(n)可以查看前n行。df.tail(): 查看后5行数据 (默认)。df.info(): 获取DataFrame的简洁摘要,包括列的Dtype、非空值数量和内存使用情况。df.describe(): 生成描述性统计信息,包括计数、均值、标准差、最小值、最大值和四分位数。df.shape: 返回一个元组,表示DataFrame的维度 (行数, 列数)。df.columns: 返回所有列名。df.index: 返回行索引。
python
print("Head:\n", df.head())
print("\nInfo:\n")
df.info()
print("\nDescription:\n", df.describe())
print("\nShape:", df.shape)
print("\nColumns:", df.columns)
5. 数据选择与过滤
这是数据分析中最频繁的操作之一。
5.1 选择列
- 单个列:返回一个Series。
python
print(df['Name'])
# 或者使用点表示法 (如果列名不含空格且不是Pandas关键字)
# print(df.Name) - 多个列:返回一个DataFrame。
python
print(df[['Name', 'Age']])
5.2 选择行
Pandas提供了 loc (基于标签) 和 iloc (基于整数位置) 两种主要的行选择方法。
-
loc(基于标签):
“`python
# 选择索引为0的行
print(df.loc[0])选择多行
print(df.loc[[0, 2]])
基于条件选择行 (非常强大)
选择年龄大于25的行
print(df.loc[df[‘Age’] > 25])
“` -
iloc(基于整数位置):
“`python
# 选择第0行
print(df.iloc[0])选择第0行和第2行
print(df.iloc[[0, 2]])
切片选择行 (类似Python列表切片)
print(df.iloc[0:2]) # 选择第0行到第1行
“`
5.3 组合选择 (行和列)
“`python
选择年龄大于25的Name和City列
print(df.loc[df[‘Age’] > 25, [‘Name’, ‘City’]])
选择第0到第1行的Name列
print(df.iloc[0:2, 0])
“`
6. 数据处理与清洗
真实世界的数据往往是混乱的,需要进行清洗和预处理。
6.1 处理缺失值
缺失值通常表示为 NaN (Not a Number)。
df.isnull(): 返回一个布尔型DataFrame,表示每个位置是否为缺失值。df.dropna(): 删除含有缺失值的行或列。df.dropna(): 默认删除至少含有一个NaN值的行。df.dropna(how='all'): 只删除所有值都是NaN的行。df.dropna(axis=1): 删除含有NaN值的列。
df.fillna(value): 填充缺失值。df.fillna(0): 用0填充所有NaN。df.fillna(df['Age'].mean()): 用’Age’列的均值填充该列的NaN。df.fillna(method='ffill'): 使用前一个有效值填充 (向前填充)。df.fillna(method='bfill'): 使用后一个有效值填充 (向后填充)。
“`python
创建一个有缺失值的DataFrame
data_missing = {
‘A’: [1, 2, np.nan, 4],
‘B’: [np.nan, 6, 7, 8],
‘C’: [9, 10, 11, 12]
}
df_missing = pd.DataFrame(data_missing)
print(“Original:\n”, df_missing)
print(“\nIs null:\n”, df_missing.isnull())
print(“\nDropped NA rows:\n”, df_missing.dropna())
print(“\nFilled NA with 0:\n”, df_missing.fillna(0))
print(“\nFilled NA with column B mean:\n”, df_missing[‘B’].fillna(df_missing[‘B’].mean()))
“`
6.2 更改数据类型
使用 astype() 方法可以更改列的数据类型。
python
df['Age'] = df['Age'].astype(float)
print(df.dtypes)
6.3 重命名列
使用 df.rename() 方法。
python
df_renamed = df.rename(columns={'Name': 'Full Name', 'City': 'Location'})
print(df_renamed)
7. 数据排序
使用 sort_values() 对DataFrame进行排序。
“`python
按Age列升序排序
df_sorted_age = df.sort_values(by=’Age’)
print(“\nSorted by Age (ascending):\n”, df_sorted_age)
按Age列降序排序
df_sorted_age_desc = df.sort_values(by=’Age’, ascending=False)
print(“\nSorted by Age (descending):\n”, df_sorted_age_desc)
按多列排序
df_sorted_multi = df.sort_values(by=[‘City’, ‘Age’])
print(“\nSorted by City then Age:\n”, df_sorted_multi)
“`
8. 分组与聚合
groupby() 是Pandas中一个极其强大的功能,用于根据一个或多个键对DataFrame进行分组,然后对每个组执行聚合操作 (如求和、均值、计数等)。
“`python
data_sales = {
‘Region’: [‘East’, ‘West’, ‘East’, ‘West’, ‘East’, ‘South’],
‘Product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘B’, ‘A’],
‘Sales’: [100, 150, 120, 200, 130, 80]
}
df_sales = pd.DataFrame(data_sales)
print(“Original Sales Data:\n”, df_sales)
按Region分组,并计算每个Region的总销售额
total_sales_by_region = df_sales.groupby(‘Region’)[‘Sales’].sum()
print(“\nTotal Sales by Region:\n”, total_sales_by_region)
按Region和Product分组,计算平均销售额
avg_sales_by_region_product = df_sales.groupby([‘Region’, ‘Product’])[‘Sales’].mean()
print(“\nAverage Sales by Region and Product:\n”, avg_sales_by_region_product)
对多个聚合函数应用
agg_results = df_sales.groupby(‘Region’).agg(
total_sales=(‘Sales’, ‘sum’),
average_sales=(‘Sales’, ‘mean’),
num_products=(‘Product’, ‘count’)
)
print(“\nAggregated Results by Region:\n”, agg_results)
“`
9. 合并与连接
在实际数据分析中,我们经常需要将来自不同源的数据集合并起来。
-
pd.concat(): 沿着某个轴将Pandas对象连接起来。
python
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']}, index=[0, 1])
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']}, index=[2, 3])
result_concat = pd.concat([df1, df2])
print("\nConcatenated DataFrames:\n", result_concat) -
pd.merge(): 类似于SQL的JOIN操作,根据一个或多个键合并DataFrame。
“`python
df_customers = pd.DataFrame({‘customer_id’: [1, 2, 3], ‘name’: [‘Alice’, ‘Bob’, ‘Charlie’]})
df_orders = pd.DataFrame({‘order_id’: [101, 102, 103], ‘customer_id’: [1, 3, 2], ‘amount’: [50, 75, 120]})merged_df = pd.merge(df_customers, df_orders, on=’customer_id’)
print(“\nMerged DataFrames (Inner Join):\n”, merged_df)不同的合并类型 (how参数: ‘inner’, ‘left’, ‘right’, ‘outer’)
“`
10. 应用函数
Pandas提供了多种方式对数据应用函数,实现更复杂的转换。
-
apply(): 用于Series或DataFrame的行/列。
“`python
# 对一列应用函数 (Series)
df[‘Age_in_5_years’] = df[‘Age’].apply(lambda x: x + 5)
print(“\nAge in 5 years:\n”, df)对DataFrame的每一行或每一列应用函数
假设我们想计算每个人的名字长度和城市名长度之和
df[‘Name_City_Len’] = df.apply(lambda row: len(row[‘Name’]) + len(row[‘City’]), axis=1)
print(“\nName and City Length Sum:\n”, df)
“` -
map(): 仅用于Series,将Series中的每个值映射到另一个值。
python
city_mapping = {'New York': 'NY', 'Los Angeles': 'LA', 'Chicago': 'CHI', 'Houston': 'HOU'}
df['City_Abbr'] = df['City'].map(city_mapping)
print("\nCity Abbreviations:\n", df)
总结
本教程涵盖了Pandas的基本概念、核心数据结构 (Series和DataFrame) 的创建与操作、数据选择与过滤、缺失值处理、数据排序、强大的分组聚合以及数据合并与函数应用。
Pandas是数据科学的基石,掌握它将极大地提高你处理和分析数据的效率。从现在开始,你可以尝试用Pandas加载真实数据集,进行探索性数据分析,并逐步深入学习其更多高级功能,例如时间序列分析、窗口函数等。实践是最好的老师,祝你在数据科学的旅程中一帆风顺!