Pandas是Python中最核心的数据分析库,专门用于处理结构化数据(表格数据)。想象一下,你手头有一份Excel表格,里面有成千上万行数据——用Excel打开会卡顿,用Python原生列表处理又太麻烦,这时候Pandas就派上用场了。
Pandas的核心数据结构:
♦ Series:一维数组,可以理解为Excel中的一列
♦ DataFrame:二维表格,就是整个Excel工作表
为什么选择Pandas?
◈ 处理百万级数据时,速度远超Excel
◈ 支持复杂的数据清洗、筛选、聚合操作
◈ 与NumPy、Matplotlib等库无缝集成
◈ 代码可复用,自动化处理流程
很多初学者困惑"什么时候该用Pandas",其实判断标准很简单:
当你拿到"脏数据"时——比如有缺失值、重复行、格式不一致等问题,Pandas的清洗函数能快速解决。
实例:处理缺失值
import pandas as pd
#- 创建有缺失值的DataFrame
data = {'姓名': ['张三', '李四', '王五', None],
'年龄': [25, None, 30, 28],
'城市': ['北京', '上海', '广州', '深圳']}
df = pd.DataFrame(data)
#- 检查缺失值
print(df.isnull().sum())
#- 填充缺失值:年龄用均值填充,姓名用"未知"填充
df['年龄'].fillna(df['年龄'].mean(), inplace=True)
df['姓名'].fillna('未知', inplace=True)
print(df)
需要按条件筛选数据、分组统计、计算指标时,Pandas的链式操作非常高效。
实例:按条件筛选并分组统计
#- 假设df是销售数据表
df = pd.read_csv('sales_data.csv')
#- 筛选2023年北京地区的销售记录
beijing_2023 = df[(df['城市'] == '北京') & (df['年份'] == 2023)]
#- 按产品类别分组,计算销售额总和
sales_by_category = beijing_2023.groupby('产品类别')['销售额'].sum()
print(sales_by_category)
虽然Pandas本身不画图,但它能快速整理出Matplotlib、Seaborn等库需要的格式。
实例:准备绘图数据
#- 计算每个月的销售均值
monthly_avg = df.groupby('月份')['销售额'].mean().reset_index()
#- 现在monthly_avg可以直接用于绘图
import matplotlib.pyplot as plt
plt.plot(monthly_avg['月份'], monthly_avg['销售额'])
plt.show()
掌握标准流程,能避免很多"不知道从何下手"的困惑:
import pandas as pd
import numpy as np # 经常一起使用
#- 从不同来源读取数据
df_csv = pd.read_csv('data.csv') # CSV文件
df_excel = pd.read_excel('data.xlsx') # Excel文件
df_sql = pd.read_sql('SELECT * FROM table', conn) # 数据库
df.head() # 查看前5行
df.info() # 查看数据类型和缺失情况
df.describe() # 数值型统计摘要
df.shape # 数据维度
df.columns # 列名列表
◈ 处理缺失值:fillna()、dropna()
◈ 删除重复行:drop_duplicates()
◈ 类型转换:astype()
◈ 重命名列:rename()
◈ 条件筛选:df[df['列名'] > 100]
◈ 新增列:df['新列'] = df['列1'] + df['列2']
◈ 分组聚合:groupby().agg()
df.to_csv('cleaned_data.csv', index=False) # 导出清洗后的数据
#- 或者直接可视化
df.plot(kind='bar') # Pandas内置简单绘图
错误提示:KeyError: '列名'
原因:列名拼写错误、列名有空格、大小写不一致
解决方案:
print(df.columns) # 先查看所有列名
#- 如果列名有空格,用df['列 名']或df.columns = df.columns.str.strip()
Bug类型2:SettingWithCopyWarning(设置副本警告)
错误提示:SettingWithCopyWarning
原因:对DataFrame的切片操作后直接赋值,Pandas不确定你是要修改原数据还是副本
解决方案:
◈ 明确使用.copy()创建副本
◈ 或使用.loc进行明确赋值:df.loc[条件, '列名'] = 值
错误提示:TypeError或计算异常
原因:列的数据类型不对(比如字符串当数字用)
解决方案:
print(df.dtypes) # 查看每列数据类型
df['数值列'] = pd.to_numeric(df['数值列'], errors='coerce') # 转换类型
错误提示:程序卡死或报内存错误
原因:数据量太大或操作方式低效
解决方案:
◈ 使用dtype参数指定列类型(如int8比int64省内存)
◈ 分批读取:chunksize=10000
◈ 使用df.memory_usage(deep=True)查看内存占用
通用调试技巧
☀ 逐行检查:在关键步骤后加print(df.head())或print(df.shape),确认数据状态
☀ 使用.copy():当不确定操作是否影响原数据时,先创建副本测试
☀ 查阅文档:遇到不熟悉的函数,用help(pd.function)或官方文档
☀ 最小化复现:用几行测试数据复现问题,更容易定位
Pandas很少单独使用,通常与以下库配合:
配合NumPy:数值计算加速
import numpy as np
#- Pandas Series转NumPy数组
arr = df['数值列'].values
#- NumPy数组转回Pandas
df['新列'] = pd.Series(arr, index=df.index)
#- 使用NumPy函数处理数据
df['标准化'] = (df['数值列'] - np.mean(df['数值列'])) / np.std(df['数值列'])
配合Matplotlib/Seaborn:数据可视化
import matplotlib.pyplot as plt
import seaborn as sns
#- 方法1:Pandas内置绘图(简单快速)
df.plot(x='日期', y='销售额', kind='line')
#- 方法2:用Seaborn绘制统计图
sns.boxplot(x='类别', y='数值', data=df)
plt.show()
from sklearn.preprocessing import StandardScaler
#- 将DataFrame转为NumPy数组供模型使用
X = df[['特征1', '特征2']].values
y = df['标签'].values
#- 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
from sqlalchemy import create_engine
#- 创建数据库连接
engine = create_engine('sqlite:///data.db')
#- 将DataFrame写入数据库
df.to_sql('table_name', engine, if_exists='replace', index=False)
#- 从数据库读取到DataFrame
df_from_db = pd.read_sql('SELECT * FROM table', engine)
假设你有一份电商销售数据,需要分析各品类销售情况:
#- 1. 读取数据
df = pd.read_csv('ecommerce_sales.csv')
#- 2. 数据探索
print(df.info())
print(df.describe())
#- 3. 数据清洗
#- 处理缺失值
df['销售额'].fillna(0, inplace=True)
df['日期'] = pd.to_datetime(df['日期']) # 转换日期类型
#- 4. 分析:按月统计各品类销售额
df['月份'] = df['日期'].dt.month
monthly_sales = df.groupby(['月份', '品类'])['销售额'].sum().reset_index()
#- 5. 可视化
import matplotlib.pyplot as plt
pivot_table = monthly_sales.pivot(index='月份', columns='品类', values='销售额')
pivot_table.plot(kind='bar', figsize=(10, 6))
plt.title('各品类月度销售额趋势')
plt.show()
#- 6. 导出结果
pivot_table.to_csv('monthly_sales_by_category.csv')