Pandas数据分析实战指南

🎙️ 语音朗读 当前: 晓晓 (温柔女声)

Pandas数据分析实战指南

Pandas是Python最强大的数据分析库,提供了高效的数据结构和分析工具。

核心数据结构

Series

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

# 创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=['a', 'b', 'c', 'd', 'e', 'f'])
print(s)
print(s['a']) # 按索引访问
print(s[1:4]) # 切片
print(s[s > 3]) # 布尔索引

DataFrame

1
2
3
4
5
6
7
8
9
10
11
# 创建DataFrame
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [25, 30, 35, 28, 32],
'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou'],
'salary': [15000, 20000, 25000, 18000, 22000]
})

print(df.head())
print(df.info())
print(df.describe())

数据读取与写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 读取CSV
df = pd.read_csv('data.csv', encoding='utf-8')

# 读取Excel
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 读取JSON
df_json = pd.read_json('data.json')

# 写入文件
df.to_csv('output.csv', index=False, encoding='utf-8')
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)

# 读取数据库
import sqlite3
conn = sqlite3.connect('database.db')
df_sql = pd.read_sql('SELECT * FROM users', conn)

数据选择与过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 选择列
df['name'] # 单列
df[['name', 'age']] # 多列

# loc:基于标签
df.loc[0:2, 'name':'city']

# iloc:基于位置
df.iloc[0:3, 0:2]

# 条件过滤
df[df['age'] > 30]
df[(df['age'] > 25) & (df['salary'] > 18000)]

# isin过滤
df[df['city'].isin(['Beijing', 'Shanghai'])]

# query方法
df.query('age > 30 and salary > 20000')

数据清洗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 处理缺失值
df_with_nan = pd.DataFrame({
'A': [1, np.nan, 3, np.nan, 5],
'B': [10, 20, np.nan, 40, 50],
'C': ['x', 'y', np.nan, 'z', 'w']
})

# 检查缺失值
print(df_with_nan.isnull().sum())

# 删除缺失值
df_drop = df_with_nan.dropna() # 删除含缺失值的行
df_drop_col = df_with_nan.dropna(axis=1) # 删除含缺失值的列

# 填充缺失值
df_fill = df_with_nan.fillna({
'A': df_with_nan['A'].mean(),
'B': 0,
'C': 'unknown'
})

# 前向/后向填充
df_ffill = df_with_nan.fillna(method='ffill')
df_bfill = df_with_nan.fillna(method='bfill')

# 处理重复值
df_dedup = df.drop_duplicates()

# 数据类型转换
df['age'] = df['age'].astype(float)
df['date'] = pd.to_datetime(df['date_column'])

分组聚合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 基本分组
grouped = df.groupby('city')

# 聚合运算
print(df.groupby('city')['salary'].mean())
print(df.groupby('city')['salary'].agg(['mean', 'median', 'std', 'count']))

# 多列分组
print(df.groupby(['city', 'age'])['salary'].mean())

# 自定义聚合
def salary_range(x):
return x.max() - x.min()

print(df.groupby('city')['salary'].agg([salary_range]))

# transform:保持原始形状
df['city_avg'] = df.groupby('city')['salary'].transform('mean')

# apply:自定义函数
def normalize(group):
return (group - group.mean()) / group.std()

df['salary_normalized'] = df.groupby('city')['salary'].transform(normalize)

数据合并

1
2
3
4
5
6
7
8
9
10
11
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value2': [4, 5, 6]})

# 合并(类似SQL JOIN)
pd.merge(df1, df2, on='key', how='inner') # 内连接
pd.merge(df1, df2, on='key', how='outer') # 外连接
pd.merge(df1, df2, on='key', how='left') # 左连接

# 拼接
pd.concat([df1, df2], axis=0) # 垂直拼接
pd.concat([df1, df2], axis=1) # 水平拼接

数据透视表

1
2
3
4
5
6
7
8
9
# 透视表
pivot = df.pivot_table(values='salary', index='city',
columns='age', aggfunc='mean')

# 交叉表
cross = pd.crosstab(df['city'], df['age'])

# melt:宽表转长表
df_long = pd.melt(df, id_vars=['name'], value_vars=['age', 'salary'])

时间序列处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建时间序列
dates = pd.date_range('2019-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(100), index=dates)

# 重采样
monthly = ts.resample('M').mean()
weekly = ts.resample('W').sum()

# 滚动窗口
rolling_mean = ts.rolling(window=7).mean()
rolling_std = ts.rolling(window=7).std()

# 时间特征提取
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.dayofweek

性能优化

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 使用category类型减少内存
df['city'] = df['city'].astype('category')

# 2. 使用dtypes指定数据类型
df = pd.read_csv('data.csv', dtype={'age': 'int8', 'salary': 'float32'})

# 3. 避免逐行操作,使用向量化
# 差: df.apply(lambda row: row['salary'] * 1.1, axis=1)
# 好: df['salary'] * 1.1

# 4. 使用eval进行大数据运算
result = df.eval('salary_bonus = salary * 1.1')

总结

Pandas提供了从数据读取、清洗、转换到分析的完整工具链。熟练掌握DataFrame操作、分组聚合、数据合并和时间序列处理,是数据分析工作的核心技能。在实际项目中,合理使用向量化操作和优化数据类型,可以显著提升处理效率。

© 2019-2026 ovo$^{mc^2}$ All Rights Reserved. | 站点总访问 28969 次 | 访客 19045
Theme by hiero