Pandas 入门教程 - 第五课: 高级数据操作
在前几节课中,我们学习了如何使用 Pandas 进行数据操作和可视化。在这一课中,我们将进一步探索一些高级的数据操作技巧,包括数据透视、分组聚合、时间序列处理以及高级索引和切片。
高级索引和切片
高级索引
Pandas 提供了强大的索引功能,可以让我们轻松地访问和操作数据。
布尔索引
import pandas as pd
# 创建一个简单的 DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
})
# 使用布尔索引选择年龄大于 30 的人
filtered_df = df[df['Age'] > 30]
print(filtered_df)
Name Age City
2 Charlie 35 Chicago
3 David 40 Houston
切片和切片
# 使用切片选择特定范围的行和列
subset_df = df[1:3, 0:2] # 选择第 2 行到第 3 行,第 1 列到第 2 列
print(subset_df)
位置索引
# 使用位置索引选择特定行和列
row_at_index_2 = df.iloc[1] # 选择第 2 行
print(row_at_index_2)
column_at_index_1 = df.iloc[:, 0] # 选择第 1 列
print(column_at_index_1)
Name Bob
Age 30
City Los Angeles
Name: 1, dtype: object
0 Alice
1 Bob
2 Charlie
3 David
Name: Name, dtype: object
标签索引
# 使用标签索引选择特定行和列
row_at_label_Bob = df.loc[df['Name'] == 'Bob'] # 选择 'Name' 为 'Bob' 的行
print(row_at_label_Bob)
column_at_label_Age = df.loc[:, 'Age'] # 选择 'Age' 列
print(column_at_label_Age)
Name Age City
1 Bob 30 Los Angeles
0 25
1 30
2 35
3 40
Name: Age, dtype: int64
高级切片
Pandas 还支持更复杂的切片操作,如基于条件的切片。
基于条件的切片
# 使用条件表达式进行切片
filtered_df = df[(df['Age'] > 25) & (df['City'] == 'Chicago')]
print(filtered_df)
Name Age City
2 Charlie 35 Chicago
分组聚合
分组聚合
Pandas 的 groupby() 方法允许我们对数据集进行分组,并对每个组进行聚合操作。
聚合函数
import pandas as pd
# 创建一个简单的 DataFrame
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C'],
'Value': [10, 20, 30, 40, 50]
})
# 使用 groupby() 方法按 'Category' 列分组,并计算每个组的平均值
grouped_df = df.groupby('Category').mean()
print(grouped_df)
Value
Category
A 15.0
B 35.0
C 50.0
自定义聚合函数
# 定义一个自定义聚合函数
def custom_aggregate(values):
return sum(values) / len(values)
# 使用 groupby() 方法按 'Category' 列分组,并使用自定义聚合函数
grouped_df_custom = df.groupby('Category').agg(custom_aggregate)
print(grouped_df_custom)
Value
Category
A 15.0
B 35.0
C 50.0
时间序列处理
时间序列数据处理
Pandas 提供了强大的时间序列处理功能,可以处理日期和时间数据。
创建时间序列
import pandas as pd
# 创建一个日期范围
dates = pd.date_range('2020-01-01', periods=100)
# 创建一个时间序列 DataFrame
ts_df = pd.DataFrame({
'Date': dates,
'Value': np.random.randn(100)
})
print(ts_df)
Date Value
0 2020-01-01 2.032894
1 2020-01-02 -1.208483
2 2020-01-03 -0.532763
3 2020-01-04 2.169684
4 2020-01-05 0.580246
.. ... ...
95 2020-04-05 0.254223
96 2020-04-06 0.461171
97 2020-04-07 0.282761
98 2020-04-08 0.091264
99 2020-04-09 0.464295
[100 rows x 2 columns]
时间序列操作
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建一个日期范围
dates = pd.date_range('2020-01-01', periods=100)
# 创建一个时间序列 DataFrame,并将日期设置为索引
ts_df = pd.DataFrame({
'Value': np.random.randn(100)
}, index=dates)
# 确保 'Value' 列是数值类型
ts_df['Value'] = ts_df['Value'].astype(float)
# 时间序列频率转换
ts_df_quarterly = ts_df.resample('Q').mean() # 转换为季度数据
ts_df_monthly = ts_df.resample('M').sum() # 转换为月度数据
# 移动平均
ma_20 = ts_df['Value'].rolling(window=20).mean()
# 绘制时间序列图
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(ts_df.index, ts_df['Value'], label='Original Data')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(ma_20.index, ma_20, label='Moving Average (20 days)', color='red')
plt.legend()
plt.show()
练习题
- 使用 Pandas 创建一个包含日期和温度的 DataFrame,并将其转换为时间序列对象。
- 如何使用 Pandas 进行日期和时间的格式化和解析