Python Pandas基础
什么是Pandas?
Pandas是Python中用于数据分析和数据处理的核心库,它提供了高效的数据结构和数据分析工具。Pandas的名称来源于"Panel Data"(面板数据)和"Python Data Analysis"(Python数据分析)的组合。自2008年由Wes McKinney开发以来,它已经成为数据科学、机器学习以及数据分析工作中不可或缺的工具。
Pandas擅长处理表格型数据(类似Excel电子表格)和时间序列数据,是数据清洗和预处理的强大工具。
安装Pandas
在开始使用Pandas之前,我们需要先安装它。使用pip命令可以轻松完成:
pip install pandas
安装完成后,我们可以在Python中导入Pandas库:
import pandas as pd
按照惯例,我们常将pandas导入为pd以便于使用。
Pandas的核心数据结构
Pandas主要提供两种数据结构:
- Series - 一维标签数组
- DataFrame - 二维标签数据表格
Series
Series是带有标签的一维数组,可以存储各种数据类型(整数、字符串、浮点数、Python对象等)。
import pandas as pd
# 创建一个简单的Series
s = pd.Series([1, 3, 5, 7, 9])
print(s)
输出:
0 1
1 3
2 5
3 7
4 9
dtype: int64
我们可以为Series指定自定义索引:
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
print(s)
输出:
a 1
b 3
c 5
d 7
e 9
dtype: int64
也可以使用字典创建Series:
d = {'a': 1, 'b': 3, 'c': 5}
s = pd.Series(d)
print(s)
输出:
a 1
b 3
c 5
dtype: int64
DataFrame
DataFrame是一个二维标签数据结构,有行和列,类似于Excel表格或SQL表。
# 创建一个简单的DataFrame
data = {
'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Age': [28, 24, 35, 32],
'City': ['New York', 'Paris', 'Berlin', 'London']
}
df = pd.DataFrame(data)
print(df)
输出:
Name Age City
0 John 28 New York
1 Anna 24 Paris
2 Peter 35 Berlin
3 Linda 32 London
我们可以指定列的顺序:
df = pd.DataFrame(data, columns=['Name', 'City', 'Age'])
print(df)
输出:
Name City Age
0 John New York 28
1 Anna Paris 24
2 Peter Berlin 35
3 Linda London 32
基本数据操作
查看数据
Pandas提供了多种方法来查看DataFrame的内容:
# 查看前几行数据
print(df.head(2)) # 默认是5行
# 查看后几行数据
print(df.tail(2))
# 查看DataFrame的基本信息
print(df.info())
# 查看数据的统计摘要
print(df.describe())
输出(前两行):
Name City Age
0 John New York 28
1 Anna Paris 24
选择数据
Pandas提供了多种方式来选择DataFrame中的数据:
选择列
# 选择单列
print(df['Name'])
# 选择多列
print(df[['Name', 'Age']])
输出(选择单列):
0 John
1 Anna
2 Peter
3 Linda
Name: Name, dtype: object
基于位置选择数据(iloc)
# 选择第一行
print(df.iloc[0])
# 选择前两行和前两列
print(df.iloc[0:2, 0:2])
输出(第一行):
Name John
City New York
Age 28
Name: 0, dtype: object
基于标签选择数据(loc)
# 选择带有特定标签的行
print(df.loc[0:1, ['Name', 'City']])
输出:
Name City
0 John New York
1 Anna Paris
条件选择
# 选择年龄大于30的人
print(df[df['Age'] > 30])
输出:
Name City Age
2 Peter Berlin 35
3 Linda London 32
增加和删除数据
添加新列
# 添加新列
df['Salary'] = [75000, 65000, 90000, 85000]
print(df)
输出:
Name City Age Salary
0 John New York 28 75000
1 Anna Paris 24 65000
2 Peter Berlin 35 90000
3 Linda London 32 85000
删除列
# 删除列
df_new = df.drop('Salary', axis=1) # axis=1表示列
print(df_new)
输出:
Name City Age
0 John New York 28
1 Anna Paris 24
2 Peter Berlin 35
3 Linda London 32
数据清洗
处理缺失值
在实际数据中,经常会遇到缺失值。Pandas使用NaN(Not a Number)表示缺失值。
import numpy as np
# 创建包含缺失值的DataFrame
data = {
'Name': ['John', 'Anna', np.nan, 'Linda'],
'Age': [28, np.nan, 35, 32],
'City': ['New York', 'Paris', 'Berlin', np.nan]
}
df = pd.DataFrame(data)
print(df)
输出:
Name Age City
0 John 28.0 New York
1 Anna NaN Paris
2 NaN 35.0 Berlin
3 Linda 32.0 NaN
检测缺失值
# 检查缺失值
print(df.isnull())
# 统计每列缺失值的数量
print(df.isnull().sum())
输出(统计每列缺失值):
Name 1
Age 1
City 1
dtype: int64
填充缺失值
# 使用指定值填充缺失值
df_filled = df.fillna(value='Unknown')
print(df_filled)
# 使用前值填充缺失值
df_ffill = df.fillna(method='ffill')
print(df_ffill)
# 使用后值填充缺失值
df_bfill = df.fillna(method='bfill')
print(df_bfill)
输出(使用指定值填充):
Name Age City
0 John 28.0 New York
1 Anna Unknown Paris
2 Unknown 35.0 Berlin
3 Linda 32.0 Unknown
删除有缺失值的行或列
# 删除有缺失值的行
df_dropna_rows = df.dropna()
print(df_dropna_rows)
# 删除有缺失值的列
df_dropna_cols = df.dropna(axis=1)
print(df_dropna_cols)
输出(删除有缺失值的行):
Empty DataFrame
Columns: [Name, Age, City]
Index: []
数据转换
类型转换
# 将Age列转换为整数类型
df['Age'] = df['Age'].astype('int32', errors='ignore') # 忽略错误,因为有NaN
print(df.dtypes)
输出:
Name object
Age float64
City object
dtype: object
重命名列
# 重命名列
df_renamed = df.rename(columns={'Name': 'FullName', 'City': 'Location'})
print(df_renamed)
输出:
FullName Age Location
0 John 28.0 New York
1 Anna NaN Paris
2 NaN 35.0 Berlin
3 Linda 32.0 NaN
数据分析
排序
# 按Age列排序
df_sorted = df.sort_values('Age', ascending=False) # 降序排列
print(df_sorted)
输出:
Name Age City
2 NaN 35.0 Berlin
3 Linda 32.0 NaN
0 John 28.0 New York
1 Anna NaN Paris
分组操作
让我们创建一个新的数据集来演示分组操作:
data = {
'Name': ['John', 'Anna', 'Peter', 'Linda', 'Bob', 'James'],
'Department': ['IT', 'HR', 'IT', 'HR', 'Finance', 'Finance'],
'Salary': [75000, 65000, 90000, 85000, 55000, 95000],
'Age': [28, 24, 35, 32, 45, 37]
}
df = pd.DataFrame(data)
print(df)
输出:
Name Department Salary Age
0 John IT 75000 28
1 Anna HR 65000 24
2 Peter IT 90000 35
3 Linda HR 85000 32
4 Bob Finance 55000 45
5 James Finance 95000 37
现在,我们可以按部门对数据进行分组并计算每个部门的平均工资:
dept_groups = df.groupby('Department')
# 查看每个部门的平均工资
print(dept_groups['Salary'].mean())
# 查看每个部门的各项统计数据
print(dept_groups.describe())
# 查看每个部门的数据计数、平均值和标准差
print(dept_groups.agg(['count', 'mean', 'std']))
输出(每个部门的平均工资):
Department
Finance 75000.0
HR 75000.0
IT 82500.0
Name: Salary, dtype: float64
合并数据
Pandas提供了多种方法来合并数据集:
连接(Concat)
# 创建两个DataFrame
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])
print(result)
输出:
A B
0 A0 B0
1 A1 B1
2 A2 B2
0 A3 B3
1 A4 B4
2 A5 B5
合并(Merge)
# 创建两个DataFrame
left = pd.DataFrame({
'key': ['K0', 'K1', 'K2'],
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']
})
right = pd.DataFrame({
'key': ['K0', 'K1', 'K3'],
'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']
})
# 按key列合并
result = pd.merge(left, right, on='key')
print(result)
输出:
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
实际案例:销售数据分析
下面我们将使用一个简单的销售数据集来展示Pandas的实际应用:
# 创建销售数据
sales_data = {
'Date': pd.date_range(start='2023-01-01', periods=10, freq='D'),
'Product': ['ProductA', 'ProductB', 'ProductA', 'ProductC', 'ProductB',
'ProductA', 'ProductC', 'ProductB', 'ProductA', 'ProductB'],
'Quantity': [10, 15, 8, 12, 20, 5, 15, 10, 8, 25],
'Price': [100, 200, 100, 150, 200, 100, 150, 200, 100, 200]
}
sales_df = pd.DataFrame(sales_data)
# 计算总销售额
sales_df['Total'] = sales_df['Quantity'] * sales_df['Price']
print(sales_df)
输出:
Date Product Quantity Price Total
0 2023-01-01 ProductA 10 100 1000
1 2023-01-02 ProductB 15 200 3000
2 2023-01-03 ProductA 8 100 800
3 2023-01-04 ProductC 12 150 1800
4 2023-01-05 ProductB 20 200 4000
5 2023-01-06 ProductA 5 100 500
6 2023-01-07 ProductC 15 150 2250
7 2023-01-08 ProductB 10 200 2000
8 2023-01-09 ProductA 8 100 800
9 2023-01-10 ProductB 25 200 5000
分析每种产品的总销售额
product_sales = sales_df.groupby('Product')['Total'].sum()
print(product_sales)
输出:
Product
ProductA 3100
ProductB 14000
ProductC 4050
Name: Total, dtype: int64
可视化每种产品的总销售额
import matplotlib.pyplot as plt
product_sales.plot(kind='bar')
plt.title('总销售额(按产品)')
plt.xlabel('产品')
plt.ylabel('销售额')
plt.show()
分析每天的销售趋势
daily_sales = sales_df.groupby('Date')['Total'].sum()
print(daily_sales)
# 可视化
daily_sales.plot(kind='line')
plt.title('每日销售趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.show()
总结
在这篇教程中,我们介绍了Pandas库的基础知识,包括:
- Pandas的核心数据结构:Series和DataFrame
- 基本数据操作:查看、选择、添加和删除数据
- 数据清洗:处理缺失值和数据转换
- 数据分析:排序、分组和合并数据
- 实际案例:销售数据分析
Pandas是数据科学和数据分析的强大工具,这里我们只是介绍了其基础功能。随着您的学习深入,您会发现Pandas能够处理更复杂的数据分析任务。
练习
为了巩固所学知识,请尝试完成以下练习:
- 创建一个包含学生姓名、学科和成绩的DataFrame,然后计算每个学生的平均成绩。
- 处理一个包含缺失值的数据集,尝试多种方法填充缺失值。
- 分析销售数据,找出销售额最高的产品和销售额最低的产品。
- 合并两个不同的数据集,例如学生个人信息和学生成绩。
- 对数据集进行排序和筛选,找出满足特定条件的记录。
附加资源
如果您想深入学习Pandas,以下资源可能对您有所帮助:
记住,学习Pandas最好的方式是通过实践。尝试用不同的数据集应用你学到的知识,解决实际问题。