Python Pandas库的基础操作教程
Pandas库简介
Pandas 是 Python 中用于数据处理和分析的核心库之一。它构建在 NumPy 之上,提供了高效的数据结构和数据分析工具。Pandas 主要有两个核心数据结构:Series 和 DataFrame,这两种数据结构使得数据处理和分析变得更加直观和高效。
安装Pandas
在开始使用 Pandas 之前,需要确保它已经安装在你的 Python 环境中。如果你使用的是 Anaconda 发行版,Pandas 通常已经预装。如果没有预装,可以使用以下命令通过 pip
安装:
pip install pandas
或者,如果你使用 conda
:
conda install pandas
Series基础
Series的创建
Series 是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签(即索引)组成。可以通过以下几种方式创建 Series:
- 从列表创建:
import pandas as pd
data = [10, 20, 30, 40]
s = pd.Series(data)
print(s)
在上述代码中,创建了一个简单的 Series,默认情况下,索引从 0 开始顺序递增。 2. 指定索引创建:
import pandas as pd
data = [10, 20, 30, 40]
index = ['a', 'b', 'c', 'd']
s = pd.Series(data, index=index)
print(s)
这里通过 index
参数指定了自定义索引,使得每个数据值与特定的标签相对应。
3. 从字典创建:
import pandas as pd
data = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data)
print(s)
字典的键会自动成为 Series 的索引,值则成为 Series 的数据。
Series的基本属性
- 索引:可以通过
index
属性获取 Series 的索引。
import pandas as pd
data = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data)
print(s.index)
- 值:通过
values
属性获取 Series 的实际数据值。
import pandas as pd
data = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data)
print(s.values)
- 数据类型:使用
dtype
属性查看 Series 中数据的类型。
import pandas as pd
data = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data)
print(s.dtype)
Series的基本操作
- 索引和切片:
- 按索引取值:
import pandas as pd
data = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data)
print(s['b'])
- **切片操作**:
import pandas as pd
data = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data)
print(s['a':'c'])
注意,与 Python 列表切片不同,Series 的切片是包含末端的。 2. 数学运算:可以对 Series 进行各种数学运算,这些运算会应用到 Series 的每个元素上。
import pandas as pd
data = [10, 20, 30, 40]
s = pd.Series(data)
result = s * 2
print(result)
- 条件筛选:可以根据条件筛选出符合要求的数据。
import pandas as pd
data = [10, 20, 30, 40]
s = pd.Series(data)
filtered = s[s > 20]
print(filtered)
DataFrame基础
DataFrame的创建
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame 既有行索引也有列索引,可以被看做是由 Series 组成的字典(共用同一个索引)。以下是创建 DataFrame 的常见方法:
- 从字典创建:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
print(df)
这里字典的键成为 DataFrame 的列名,值则组成了 DataFrame 的数据。 2. 从列表的字典创建:
import pandas as pd
data = [
{'col1': 1, 'col2': 4},
{'col1': 2, 'col2': 5},
{'col1': 3, 'col2': 6}
]
df = pd.DataFrame(data)
print(df)
- 从 Series 创建:
import pandas as pd
s1 = pd.Series([1, 2, 3], name='col1')
s2 = pd.Series([4, 5, 6], name='col2')
df = pd.DataFrame([s1, s2]).transpose()
print(df)
DataFrame的基本属性
- 索引:与 Series 类似,DataFrame 也有
index
属性用于获取行索引。
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
print(df.index)
- 列:通过
columns
属性获取列索引。
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
print(df.columns)
- 形状:使用
shape
属性获取 DataFrame 的行数和列数。
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
print(df.shape)
- 数据类型:
dtypes
属性可以查看每列的数据类型。
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
print(df.dtypes)
DataFrame的基本操作
- 选取列:
- 通过列名选取单列:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
col1 = df['col1']
print(col1)
- **选取多列**:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]
}
df = pd.DataFrame(data)
cols = df[['col1', 'col3']]
print(cols)
- 选取行:
- 通过索引标签选取行:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
row = df.loc['b']
print(row)
- **通过整数位置选取行**:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
row = df.iloc[1]
print(row)
- 索引和切片综合操作:
- 选取特定的行和列:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
subset = df.loc[['a', 'c'], ['col1', 'col3']]
print(subset)
- **通过切片选取**:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]
}
df = pd.DataFrame(data)
subset = df.iloc[0:2, 1:3]
print(subset)
- 数据添加与修改:
- 添加列:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
df['col3'] = [7, 8, 9]
print(df)
- **修改列数据**:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
df['col1'] = df['col1'] * 2
print(df)
- 删除列和行:
- 删除列:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]
}
df = pd.DataFrame(data)
df = df.drop('col3', axis=1)
print(df)
- **删除行**:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
df = df.drop('b', axis=0)
print(df)
数据清洗
处理缺失值
在实际的数据处理中,缺失值是很常见的问题。Pandas 提供了多种方法来处理缺失值。
- 检测缺失值:可以使用
isnull()
和notnull()
方法来检测 DataFrame 中的缺失值。
import pandas as pd
data = {
'col1': [1, None, 3],
'col2': [4, 5, None]
}
df = pd.DataFrame(data)
missing_values = df.isnull()
print(missing_values)
- 删除缺失值:
dropna()
方法可以删除包含缺失值的行或列。
import pandas as pd
data = {
'col1': [1, None, 3],
'col2': [4, 5, None]
}
df = pd.DataFrame(data)
df = df.dropna()
print(df)
默认情况下,dropna()
删除任何包含缺失值的行。可以通过设置 axis
参数删除列,以及通过 how='all'
等参数来更精细地控制删除条件。
3. 填充缺失值:fillna()
方法用于填充缺失值。
import pandas as pd
data = {
'col1': [1, None, 3],
'col2': [4, 5, None]
}
df = pd.DataFrame(data)
df = df.fillna(0)
print(df)
也可以使用更复杂的填充策略,比如使用前一个值填充 method='ffill'
,或使用后一个值填充 method='bfill'
。
处理重复值
- 检测重复值:
duplicated()
方法可以检测 DataFrame 中的重复行。
import pandas as pd
data = {
'col1': [1, 2, 2],
'col2': [4, 5, 5]
}
df = pd.DataFrame(data)
duplicates = df.duplicated()
print(duplicates)
- 删除重复值:
drop_duplicates()
方法用于删除重复行。
import pandas as pd
data = {
'col1': [1, 2, 2],
'col2': [4, 5, 5]
}
df = pd.DataFrame(data)
df = df.drop_duplicates()
print(df)
数据聚合与分组
分组操作
分组操作是数据分析中非常重要的一部分,Pandas 通过 groupby
方法实现分组功能。假设我们有一个包含销售数据的 DataFrame,其中有产品名称、销售地区和销售额等信息,我们可以按照产品名称或销售地区进行分组,并对销售额进行聚合操作。
import pandas as pd
data = {
'product': ['A', 'B', 'A', 'B'],
'region': ['North', 'South', 'North', 'South'],
'sales': [100, 200, 150, 250]
}
df = pd.DataFrame(data)
grouped = df.groupby('product')
print(grouped)
这里通过 groupby
方法按照 product
列进行了分组,返回的 grouped
对象包含了分组的信息。
聚合函数
- 常用聚合函数:对分组后的数据可以应用各种聚合函数,如
sum
、mean
、count
等。
import pandas as pd
data = {
'product': ['A', 'B', 'A', 'B'],
'region': ['North', 'South', 'North', 'South'],
'sales': [100, 200, 150, 250]
}
df = pd.DataFrame(data)
grouped = df.groupby('product')
aggregated = grouped['sales'].sum()
print(aggregated)
上述代码中,按照 product
分组后,对 sales
列求了总和。类似地,可以使用 mean()
求平均值,count()
统计数量等。
2. 自定义聚合函数:除了使用内置的聚合函数,还可以定义自己的聚合函数。
import pandas as pd
def custom_aggregation(x):
return x.max() - x.min()
data = {
'product': ['A', 'B', 'A', 'B'],
'region': ['North', 'South', 'North', 'South'],
'sales': [100, 200, 150, 250]
}
df = pd.DataFrame(data)
grouped = df.groupby('product')
aggregated = grouped['sales'].agg(custom_aggregation)
print(aggregated)
这里定义了一个计算最大值与最小值之差的自定义聚合函数,并应用到分组后的数据上。
数据合并与连接
合并操作(merge)
merge
方法类似于 SQL 中的 JOIN
操作,用于根据一个或多个键将不同的 DataFrame 合并在一起。假设我们有两个 DataFrame,一个包含学生的基本信息,另一个包含学生的成绩信息,我们可以根据学生 ID 将两个 DataFrame 合并。
import pandas as pd
students = {
'student_id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie']
}
student_df = pd.DataFrame(students)
scores = {
'student_id': [1, 2, 4],
'score': [85, 90, 78]
}
score_df = pd.DataFrame(scores)
merged = pd.merge(student_df, score_df, on='student_id')
print(merged)
默认情况下,merge
执行内连接,只返回在两个 DataFrame 中都存在的键值对应的行。可以通过 how
参数指定连接方式,如 'left'
、'right'
、'outer'
等。
连接操作(concat)
concat
方法用于沿着一个轴(行或列)将多个 DataFrame 连接在一起。
- 按行连接:
import pandas as pd
df1 = pd.DataFrame({
'col1': [1, 2],
'col2': [3, 4]
})
df2 = pd.DataFrame({
'col1': [5, 6],
'col2': [7, 8]
})
concatenated = pd.concat([df1, df2])
print(concatenated)
- 按列连接:
import pandas as pd
df1 = pd.DataFrame({
'col1': [1, 2],
'col2': [3, 4]
})
df2 = pd.DataFrame({
'col3': [5, 6],
'col4': [7, 8]
})
concatenated = pd.concat([df1, df2], axis=1)
print(concatenated)
数据读取与写入
读取数据
Pandas 支持多种数据格式的读取,如 CSV、Excel、SQL 等。
- 读取 CSV 文件:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
read_csv
方法有很多参数,可以用于指定分隔符、编码、是否有表头等等。
2. 读取 Excel 文件:
import pandas as pd
df = pd.read_excel('data.xlsx')
print(df.head())
同样,read_excel
也有参数可用于指定工作表名称、是否忽略表头等等。
写入数据
- 写入 CSV 文件:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
df.to_csv('output.csv', index=False)
to_csv
方法的 index=False
参数表示不将行索引写入文件。
2. 写入 Excel 文件:
import pandas as pd
data = {
'col1': [1, 2, 3],
'col2': [4, 5, 6]
}
df = pd.DataFrame(data)
df.to_excel('output.xlsx', index=False)
通过以上对 Pandas 库基础操作的详细介绍,希望能帮助你快速上手使用 Pandas 进行数据处理和分析。在实际应用中,Pandas 的功能远不止于此,随着对数据处理需求的深入,你可以进一步探索其更高级的功能。