一、库的简介
Pandas是Python数据处理领域最核心的库之一,它提供了高效、灵活的数据结构(如DataFrame和Series),使得数据清洗、分析和可视化变得异常简单。在实际生活中,Pandas的应用场景无处不在:金融分析师用它处理股票交易数据,市场人员用它分析用户行为模式,研究人员用它整理实验数据,甚至普通用户也可以用Pandas来管理个人财务或健身记录。当你在电商平台看到个性化推荐、在银行APP查看消费分析报告,或是在新闻中看到数据驱动的决策分析时,背后往往都有Pandas的功劳。它构建在NumPy之上,但提供了更高层次的抽象,使得处理表格数据、时间序列和异构数据变得更加直观和高效。
二、安装库
安装Pandas有多种方式,可以根据不同的使用场景选择:
python
# 基础安装(使用pip)
pip install pandas
# 安装完整版(包含所有可选依赖)
pip install pandas[all]
# 使用conda安装
conda install pandas
# 验证安装
import pandas as pd
print(f"Pandas版本: {pd.__version__}")
# 检查可选依赖
print(f"NumPy版本: {pd.show_versions()}")
对于需要处理Excel文件的场景,建议额外安装:
bash
pip install openpyxl xlsxwriter
三、基本用法
1. 创建DataFrame和Series
python
import pandas as pd
import numpy as np
# 创建Series(一维标签数组)
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(f"Series:\n{s}")
print(f"索引: {s.index}")
print(f"值: {s.values}")
# 创建DataFrame(二维表格)
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'城市': ['北京', '上海', '广州', '深圳'],
'工资': [15000, 20000, 18000, 22000]
}
df = pd.DataFrame(data)
print(f"\nDataFrame:\n{df}")
# 使用列表创建DataFrame
data_list = [
['苹果', 10, 5.5],
['香蕉', 20, 3.2],
['橙子', 15, 4.8]
]
df2 = pd.DataFrame(data_list, columns=['水果', '库存', '单价'])
print(f"\n商品DataFrame:\n{df2}")
2. 数据读取和写入
python
# 从各种格式读取数据
df_csv = pd.read_csv('data.csv') # CSV文件
df_excel = pd.read_excel('data.xlsx') # Excel文件
df_json = pd.read_json('data.json') # JSON文件
df_sql = pd.read_sql('SELECT * FROM table', connection) # SQL数据库
# 写入数据到文件
df.to_csv('output.csv', index=False) # 写入CSV
df.to_excel('output.xlsx', sheet_name='Sheet1') # 写入Excel
df.to_json('output.json', orient='records') # 写入JSON
# 读取网络数据示例
url = 'https://raw.githubusercontent.com/datasets/covid-19/master/data/time-series-19-covid-combined.csv'
covid_data = pd.read_csv(url)
print(f"COVID数据形状: {covid_data.shape}")
3. 数据查看和基本信息
python
# 创建示例数据
data = {
'产品': ['手机', '电脑', '平板', '手表', '耳机'],
'销量': [120, 85, 60, 150, 200],
'价格': [2999.99, 5999.99, 3999.99, 1999.99, 899.99],
'库存': [50, 30, 45, 100, 150],
'上架日期': pd.date_range('2024-01-01', periods=5)
}
df = pd.DataFrame(data)
# 查看数据
print("前3行:")
print(df.head(3))
print("\n后2行:")
print(df.tail(2))
print("\n基本信息:")
print(df.info())
print("\n描述性统计:")
print(df.describe())
print("\n数据类型:")
print(df.dtypes)
print("\n形状:", df.shape)
print("列名:", df.columns.tolist())
4. 数据选择和筛选
python
# 列选择
print("选择单列:")
print(df['产品'])
print("\n选择多列:")
print(df[['产品', '销量', '价格']])
# 行选择(按标签)
print("\n按标签选择行:")
print(df.loc[0:2]) # 包含结束位置
# 行选择(按位置)
print("\n按位置选择行:")
print(df.iloc[0:3]) # 不包含结束位置
# 条件筛选
print("\n销量大于100的产品:")
print(df[df['销量'] > 100])
print("\n价格在2000-4000之间的产品:")
print(df[(df['价格'] >= 2000) & (df['价格'] <= 4000)])
print("\n使用query方法筛选:")
print(df.query('销量 > 100 and 价格 < 3000'))
# 字符串筛选
print("\n产品名称包含'手'的产品:")
print(df[df['产品'].str.contains('手')])
四、高级用法
1. 数据聚合和分组
python
# 创建销售数据
sales_data = {
'日期': pd.date_range('2024-01-01', periods=30),
'产品类别': np.random.choice(['电子产品', '服装', '食品', '家居'], 30),
'城市': np.random.choice(['北京', '上海', '广州', '深圳'], 30),
'销售额': np.random.randint(1000, 10000, 30),
'利润': np.random.randint(100, 2000, 30)
}
sales_df = pd.DataFrame(sales_data)
# 分组聚合
print("按产品类别分组统计:")
category_stats = sales_df.groupby('产品类别').agg({
'销售额': ['sum', 'mean', 'count'],
'利润': ['sum', 'mean']
})
print(category_stats)
print("\n多级分组:")
multi_group = sales_df.groupby(['城市', '产品类别']).agg({
'销售额': 'sum',
'利润': 'mean'
}).round(2)
print(multi_group)
# 透视表
print("\n透视表:")
pivot_table = pd.pivot_table(
sales_df,
values='销售额',
index='产品类别',
columns='城市',
aggfunc='sum',
fill_value=0
)
print(pivot_table)
2. 时间序列处理
python
# 创建时间序列数据
date_rng = pd.date_range(start='2024-01-01', end='2024-12-31', freq='D')
time_series = pd.DataFrame(date_rng, columns=['date'])
time_series['value'] = np.random.randn(len(date_rng)).cumsum() + 100
# 设置为索引
time_series.set_index('date', inplace=True)
print("时间序列重采样(按月):")
monthly_resample = time_series.resample('M').agg(['mean', 'min', 'max'])
print(monthly_resample.head())
print("\n移动窗口计算:")
time_series['7_day_avg'] = time_series['value'].rolling(window=7).mean()
time_series['30_day_std'] = time_series['value'].rolling(window=30).std()
print("\n时间偏移:")
time_series['prev_month'] = time_series['value'].shift(30)
# 季节分解
from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(time_series['value'].head(365), model='additive', period=30)
3. 数据合并和连接
python
# 创建多个DataFrame
df1 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'姓名': ['张三', '李四', '王五', '赵六'],
'部门': ['技术部', '市场部', '技术部', '人事部']
})
df2 = pd.DataFrame({
'ID': [1, 2, 3, 5],
'工资': [15000, 20000, 18000, 22000],
'入职年份': [2020, 2021, 2019, 2022]
})
df3 = pd.DataFrame({
'ID': [2, 3, 4, 6],
'项目数': [5, 3, 7, 2],
'绩效': ['A', 'B', 'A', 'C']
})
# 合并操作
print("内连接:")
inner_join = pd.merge(df1, df2, on='ID', how='inner')
print(inner_join)
print("\n左连接:")
left_join = pd.merge(df1, df2, on='ID', how='left')
print(left_join)
print("\n外连接:")
outer_join = pd.merge(df1, df2, on='ID', how='outer')
print(outer_join)
print("\n多DataFrame合并:")
merged_all = pd.merge(pd.merge(df1, df2, on='ID', how='outer'),
df3, on='ID', how='outer')
print(merged_all)
# 纵向合并
df4 = pd.DataFrame({
'ID': [7, 8],
'姓名': ['钱七', '孙八'],
'部门': ['财务部', '法务部']
})
vertical_merge = pd.concat([df1, df4], ignore_index=True)
print("\n纵向合并:\n", vertical_merge)
五、实际应用场景
1. 个人财务管理系统
python
class PersonalFinanceManager:
def __init__(self):
self.transactions = pd.DataFrame(columns=[
'日期', '类别', '子类别', '金额', '支付方式', '备注'
])
self.categories = {
'收入': ['工资', '奖金', '投资回报', '其他收入'],
'支出': {
'生活': ['餐饮', '交通', '日用品'],
'住房': ['房租', '水电', '物业'],
'娱乐': ['电影', '旅行', '购物'],
'投资': ['股票', '基金', '保险']
}
}
def add_transaction(self, date, category, subcategory, amount,
payment_method='', note=''):
"""添加交易记录"""
new_transaction = pd.DataFrame({
'日期': [pd.to_datetime(date)],
'类别': [category],
'子类别': [subcategory],
'金额': [amount],
'支付方式': [payment_method],
'备注': [note]
})
self.transactions = pd.concat(
[self.transactions, new_transaction],
ignore_index=True
)
def monthly_summary(self, year_month=None):
"""月度收支统计"""
df = self.transactions.copy()
df['年月'] = df['日期'].dt.to_period('M')
if year_month:
df = df[df['年月'] == pd.Period(year_month)]
# 计算收支
income = df[df['类别'] == '收入']['金额'].sum()
expense = df[df['类别'] == '支出']['金额'].sum()
balance = income - expense
# 支出分类统计
expense_by_category = df[df['类别'] == '支出'].groupby('子类别')['金额'].sum()
return {
'总收入': income,
'总支出': expense,
'结余': balance,
'支出分类': expense_by_category,
'储蓄率': balance / income if income > 0 else 0
}
def spending_trend(self, category=None):
"""消费趋势分析"""
df = self.transactions.copy()
df['年月'] = df['日期'].dt.to_period('M')
if category:
df = df[df['子类别'] == category]
# 按时间分组
trend = df.groupby('年月').agg({
'金额': ['sum', 'count', 'mean']
})
# 计算环比
trend['环比增长'] = trend[('金额', 'sum')].pct_change()
return trend
def budget_analysis(self, budget_plan):
"""预算分析"""
df = self.transactions.copy()
df['年月'] = df['日期'].dt.to_period('M')
# 合并预算计划
budget_df = pd.DataFrame(budget_plan).T.stack().reset_index()
budget_df.columns = ['类别', '子类别', '预算金额']
# 计算实际支出
actual_expense = df[
(df['类别'] == '支出') &
(df['年月'] == pd.Period('2024-01'))
].groupby(['类别', '子类别'])['金额'].sum().reset_index()
# 合并实际与预算
comparison = pd.merge(
budget_df, actual_expense,
on=['类别', '子类别'],
how='left'
).fillna(0)
comparison['超支'] = comparison['金额'] - comparison['预算金额']
comparison['预算使用率'] = comparison['金额'] / comparison['预算金额']
return comparison
def generate_report(self, start_date, end_date):
"""生成详细报告"""
mask = (self.transactions['日期'] >= start_date) & \
(self.transactions['日期'] <= end_date)
period_data = self.transactions[mask].copy()
report = {
'概览': {
'交易笔数': len(period_data),
'总金额': period_data['金额'].sum(),
'平均交易额': period_data['金额'].mean(),
'最大交易额': period_data['金额'].max()
},
'收支平衡': self.monthly_summary(),
'消费习惯': {
'最常用支付方式': period_data['支付方式'].mode().iloc[0],
'高频消费类别': period_data[period_data['类别'] == '支出']
['子类别'].value_counts().head(5).to_dict()
},
'时间分析': {
'周消费模式': period_data.groupby(
period_data['日期'].dt.dayofweek
)['金额'].sum(),
'日消费趋势': period_data.set_index('日期')['金额'].resample('D').sum()
}
}
return report
# 使用示例
finance = PersonalFinanceManager()
# 添加示例数据
finance.add_transaction('2024-01-05', '收入', '工资', 20000, '银行卡', '月薪')
finance.add_transaction('2024-01-10', '支出', '餐饮', 150, '支付宝', '午餐')
finance.add_transaction('2024-01-15', '支出', '交通', 200, '微信', '地铁充值')
finance.add_transaction('2024-01-20', '支出', '购物', 800, '信用卡', '衣服')
finance.add_transaction('2024-01-25', '收入', '奖金', 5000, '银行卡', '季度奖')
# 生成报告
report = finance.generate_report('2024-01-01', '2024-01-31')
print("财务报告摘要:")
for key, value in report['概览'].items():
print(f"{key}: {value}")
2. 电商用户行为分析系统
python
class ECommerceAnalyzer:
def __init__(self):
self.users = pd.DataFrame()
self.products = pd.DataFrame()
self.orders = pd.DataFrame()
self.behaviors = pd.DataFrame()
def load_sample_data(self):
"""加载示例数据"""
np.random.seed(42)
# 用户数据
self.users = pd.DataFrame({
'user_id': range(1, 1001),
'age': np.random.randint(18, 65, 1000),
'gender': np.random.choice(['M', 'F'], 1000),
'city': np.random.choice(['北京', '上海', '广州', '深圳', '杭州', '成都'], 1000),
'registration_date': pd.date_range('2023-01-01', periods=1000, freq='D')
})
# 商品数据
categories = ['电子产品', '服装', '家居', '美妆', '食品', '图书']
self.products = pd.DataFrame({
'product_id': range(1, 501),
'category': np.random.choice(categories, 500),
'price': np.random.uniform(10, 2000, 500).round(2),
'stock': np.random.randint(0, 1000, 500)
})
# 订单数据
self.orders = pd.DataFrame({
'order_id': range(1, 5001),
'user_id': np.random.choice(self.users['user_id'], 5000),
'product_id': np.random.choice(self.products['product_id'], 5000),
'quantity': np.random.randint(1, 5, 5000),
'order_time': pd.date_range('2024-01-01', periods=5000, freq='H')
})
# 合并价格信息
self.orders = pd.merge(
self.orders,
self.products[['product_id', 'price']],
on='product_id'
)
self.orders['total_amount'] = self.orders['quantity'] * self.orders['price']
def user_segmentation(self):
"""用户分群"""
# 计算用户行为指标
user_stats = self.orders.groupby('user_id').agg({
'order_id': 'count', # 订单数
'total_amount': 'sum', # 总消费
'product_id': lambda x: x.nunique() # 购买商品种类
}).rename(columns={
'order_id': 'order_count',
'total_amount': 'total_spent',
'product_id': 'unique_products'
})
# 合并用户属性
user_segments = pd.merge(
user_stats,
self.users.set_index('user_id'),
left_index=True,
right_index=True
)
# RFM分析
current_date = self.orders['order_time'].max()
# 计算RFM值
rfm = self.orders.groupby('user_id').agg({
'order_time': lambda x: (current_date - x.max()).days, # 最近购买
'order_id': 'count', # 购买频率
'total_amount': 'sum' # 购买金额
}).rename(columns={
'order_time': 'recency',
'order_id': 'frequency',
'total_amount': 'monetary'
})
# RFM分箱
rfm['R_score'] = pd.qcut(rfm['recency'], 4, labels=[4, 3, 2, 1])
rfm['F_score'] = pd.qcut(rfm['frequency'], 4, labels=[1, 2, 3, 4])
rfm['M_score'] = pd.qcut(rfm['monetary'], 4, labels=[1, 2, 3, 4])
rfm['RFM_score'] = rfm['R_score'].astype(str) + \
rfm['F_score'].astype(str) + \
rfm['M_score'].astype(str)
# 用户分群
def segment_user(row):
if row['R_score'] >= 3 and row['F_score'] >= 3 and row['M_score'] >= 3:
return '高价值用户'
elif row['R_score'] >= 3 and row['F_score'] >= 2:
return '活跃用户'
elif row['R_score'] < 2:
return '流失用户'
else:
return '一般用户'
rfm['segment'] = rfm.apply(segment_user, axis=1)
return rfm
def sales_analysis(self):
"""销售分析"""
# 时间序列分析
orders_ts = self.orders.set_index('order_time')
# 按日统计
daily_sales = orders_ts.resample('D').agg({
'order_id': 'count',
'total_amount': 'sum'
}).rename(columns={
'order_id': 'order_count',
'total_amount': 'daily_revenue'
})
# 计算移动平均
daily_sales['7d_avg_orders'] = daily_sales['order_count'].rolling(7).mean()
daily_sales['7d_avg_revenue'] = daily_sales['daily_revenue'].rolling(7).mean()
# 商品分析
product_stats = self.orders.groupby('product_id').agg({
'order_id': 'count',
'quantity': 'sum',
'total_amount': 'sum'
}).rename(columns={
'order_id': 'sales_count',
'quantity': 'total_quantity',
'total_amount': 'total_revenue'
})
# 合并商品信息
product_stats = pd.merge(
product_stats,
self.products.set_index('product_id'),
left_index=True,
right_index=True
)
# 计算商品指标
product_stats['avg_price'] = product_stats['total_revenue'] / product_stats['total_quantity']
product_stats['conversion_rate'] = product_stats['sales_count'] / len(self.users)
return {
'daily_sales': daily_sales,
'product_stats': product_stats
}
def recommendation_engine(self, user_id, n_recommendations=5):
"""基于协同过滤的推荐"""
# 创建用户-商品矩阵
user_product_matrix = self.orders.pivot_table(
index='user_id',
columns='product_id',
values='quantity',
aggfunc='sum',
fill_value=0
)
if user_id not in user_product_matrix.index:
# 新用户,返回热门商品
top_products = self.orders['product_id'].value_counts().head(n_recommendations)
return self.products[self.products['product_id'].isin(top_products.index)]
# 计算用户相似度
from sklearn.metrics.pairwise import cosine_similarity
user_similarity = cosine_similarity(user_product_matrix)
user_similarity_df = pd.DataFrame(
user_similarity,
index=user_product_matrix.index,
columns=user_product_matrix.index
)
# 找到相似用户
similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:11]
# 获取相似用户购买的商品
similar_users_products = user_product_matrix.loc[similar_users.index].sum()
# 排除用户已购买的商品
user_products = user_product_matrix.loc[user_id]
recommended_products = similar_users_products[user_products == 0]
# 获取前N个推荐
top_recommendations = recommended_products.sort_values(ascending=False).head(n_recommendations)
return self.products[self.products['product_id'].isin(top_recommendations.index)]
# 使用示例
analyzer = ECommerceAnalyzer()
analyzer.load_sample_data()
# 用户分群分析
segments = analyzer.user_segmentation()
segment_distribution = segments['segment'].value_counts()
print("用户分群分布:")
print(segment_distribution)
# 销售分析
sales_data = analyzer.sales_analysis()
print(f"\n总销售额: ${sales_data['product_stats']['total_revenue'].sum():,.2f}")
print(f"平均客单价: ${sales_data['daily_sales']['daily_revenue'].mean():.2f}")
# 商品推荐
recommendations = analyzer.recommendation_engine(user_id=10)
print("\n给用户10的推荐商品:")
print(recommendations[['product_id', 'category', 'price']])
Pandas作为Python数据科学生态的核心,其重要性不仅体现在技术层面,更体现在它极大地降低了数据处理的入门门槛。通过简洁直观的API设计,Pandas让复杂的数据操作变得简单易用,使得数据分析不再是专业数据科学家的专利。无论是个人数据处理还是企业级数据分析,Pandas都提供了完整的解决方案。它的强大之处在于灵活性——从简单的数据筛选到复杂的时间序列分析,从基础的数据聚合到高级的机器学习特征工程,Pandas都能胜任。
随着数据规模的不断增长,Pandas也在不断进化。新版本中增强的性能优化、更丰富的数据类型支持,以及与大数据框架(如Dask、Polars)的更好集成,都体现了Pandas生态系统强大的生命力。掌握Pandas不仅意味着掌握了一个工具,更是掌握了一种数据思维——如何将原始数据转化为有价值的洞见。
你在使用Pandas时有什么特别的技巧或遇到过什么挑战?或者你有关于数据处理的独特应用场景想要分享吗?欢迎在评论区交流你的经验和想法!
2906

被折叠的 条评论
为什么被折叠?



