pandas,一个实用的 Python 库!

一、库的简介

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时有什么特别的技巧或遇到过什么挑战?或者你有关于数据处理的独特应用场景想要分享吗?欢迎在评论区交流你的经验和想法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值