跳到主要内容

Pandas 数据分析

Pandas 是 Python 最核心的数据分析库,提供了 Series(一维数据)和 DataFrame(二维表格)两种数据结构,让数据处理像操作电子表格一样直观。

安装

pip install pandas openpyxl

Series:带标签的一维数组

import pandas as pd

# 从列表创建
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
# a 10
# b 20
# c 30
# d 40
# dtype: int64

print(s['b']) # 20
print(s[['a', 'c']]) # 通过标签列表索引
print(s[s > 25]) # 布尔索引

DataFrame:二维表格

# 从字典创建
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 28],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Shenzhen'],
'score': [85.5, 92.0, 78.5, 88.0]
})

print(df)
# name age city score
# 0 Alice 25 Beijing 85.5
# 1 Bob 30 Shanghai 92.0
# 2 Charlie 35 Beijing 78.5
# 3 David 28 Shenzhen 88.0

读取与保存数据

# 读取 CSV
df = pd.read_csv('data.csv')
df = pd.read_csv('data.csv', encoding='utf-8', index_col=0)

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

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

# 保存数据
df.to_csv('output.csv', index=False)
df.to_excel('output.xlsx', index=False)

查看数据

print(df.head()) # 前5行
print(df.head(10)) # 前10行
print(df.tail()) # 后5行
print(df.shape) # (行数, 列数)
print(df.columns) # 列名
print(df.index) # 行索引
print(df.dtypes) # 每列数据类型
print(df.info()) # 详细信息(含缺失值)
print(df.describe()) # 数值列的统计摘要

选择与过滤

# 选择列
print(df['name']) # 单列(Series)
print(df[['name', 'age']]) # 多列(DataFrame)

# loc:按标签索引
print(df.loc[0]) # 第一行
print(df.loc[0:2, 'name':'city']) # 行标签0~2,列name~city
print(df.loc[df['age'] > 28]) # 布尔条件

# iloc:按位置索引
print(df.iloc[0]) # 第一行
print(df.iloc[0:3, 0:2]) # 前3行,前2列
print(df.iloc[-1]) # 最后一行

# 条件过滤
print(df[df['age'] > 28]) # 年龄大于28
print(df[(df['age'] > 25) & (df['score'] > 80)]) # 多条件(与)
print(df[df['city'].isin(['Beijing', 'Shanghai'])]) # 在列表中

数据处理

缺失值

# 创建含缺失值的数据
df2 = pd.DataFrame({
'A': [1, 2, None, 4],
'B': [5, None, 7, 8]
})

print(df2.isnull()) # 判断缺失值
print(df2.isnull().sum()) # 每列缺失值数量
print(df2.dropna()) # 删除含缺失值的行
print(df2.dropna(axis=1)) # 删除含缺失值的列
print(df2.fillna(0)) # 用0填充
print(df2['A'].fillna(df2['A'].mean())) # 用均值填充

去重与排序

# 去重
df.drop_duplicates() # 删除完全重复的行
df.drop_duplicates(subset=['city']) # 按 city 列去重

# 排序
df.sort_values('age') # 按 age 升序
df.sort_values('age', ascending=False) # 降序
df.sort_values(['city', 'age']) # 多列排序

新增与修改列

# 新增列
df['passed'] = df['score'] >= 60 # 布尔列
df['score_100'] = df['score'] / 100 # 计算列

# 修改列
df['age'] = df['age'] + 1 # 年龄加1
df['city'] = df['city'].str.upper() # 转大写

# apply 应用函数
df['grade'] = df['score'].apply(lambda x: 'A' if x >= 90 else 'B' if x >= 80 else 'C')

删除行列

df.drop('score_100', axis=1) # 删除列
df.drop(0, axis=0) # 删除行(索引为0)
df.drop(columns=['grade', 'passed']) # 删除多列

分组聚合

# 按城市分组,计算平均年龄和平均分数
grouped = df.groupby('city').agg({
'age': 'mean',
'score': 'mean'
})
print(grouped)

# 常用聚合函数
df.groupby('city')['score'].sum() # 求和
df.groupby('city')['score'].mean() # 平均
df.groupby('city')['score'].count() # 计数
df.groupby('city')['score'].max() # 最大
df.groupby('city')['score'].min() # 最小

# 多列分组
df.groupby(['city', 'passed'])['score'].mean()

合并数据

df1 = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'id': [1, 2, 4], 'score': [85, 92, 78]})

# SQL 风格的 join
merged = pd.merge(df1, df2, on='id', how='inner') # 内连接
merged = pd.merge(df1, df2, on='id', how='left') # 左连接
merged = pd.merge(df1, df2, on='id', how='right') # 右连接
merged = pd.merge(df1, df2, on='id', how='outer') # 外连接

# 纵向拼接
df3 = pd.concat([df1, df2], axis=0) # 按行拼接
df4 = pd.concat([df1, df2], axis=1) # 按列拼接

数据透视表

pivot = df.pivot_table(
values='score',
index='city',
columns='passed',
aggfunc='mean',
fill_value=0
)
print(pivot)

时间序列

# 创建日期范围
dates = pd.date_range('2024-01-01', periods=10, freq='D')
ts = pd.Series(range(10), index=dates)

# 重采样
ts.resample('W').mean() # 按周平均
ts.resample('M').sum() # 按月求和

# 字符串转日期
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month

小结

功能常用方法
读取数据read_csv, read_excel, read_json
查看数据head, tail, info, describe
选择数据loc, iloc, []
过滤布尔条件, isin
缺失值isnull, dropna, fillna
分组groupby + agg
合并merge, concat
透视表pivot_table