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 |