欢迎光临澄迈县白事服务网
详情描述
Python Pandas 数据处理三大实用技巧

Pandas是Python数据分析的核心库,掌握一些实用技巧能极大提升数据处理效率。以下是三大核心技巧:

1. 链式操作:编写更优雅的代码

链式操作可以避免创建过多中间变量,使代码更简洁易读。

import pandas as pd
import numpy as np

# 创建示例数据
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 35, 28, 32],
    '城市': ['北京', '上海', '北京', '广州', '深圳'],
    '薪资': [8000, 12000, 9500, 8500, 11000],
    '入职年份': [2018, 2015, 2019, 2017, 2016]
}
df = pd.DataFrame(data)

# 传统方式(创建多个中间变量)
df_filtered = df[df['年龄'] > 28]
df_sorted = df_filtered.sort_values('薪资', ascending=False)
df_result = df_sorted[['姓名', '城市', '薪资']]
print("传统方式:")
print(df_result)

# 链式操作方式
result = (df[df['年龄'] > 28]  # 筛选年龄大于28
          .sort_values('薪资', ascending=False)  # 按薪资降序
          .loc[:, ['姓名', '城市', '薪资']]  # 选择特定列
          .reset_index(drop=True))  # 重置索引
print("\n链式操作方式:")
print(result)

# 更复杂的链式操作示例
result2 = (df
          .assign(工龄=lambda x: 2023 - x['入职年份'],  # 添加新列
                  薪资级别=lambda x: np.where(x['薪资'] > 10000, '高', '中'))
          .query('工龄 >= 4')  # 使用query筛选
          .groupby('城市')
          .agg({'薪资': ['mean', 'max'], '年龄': 'mean'})
          .round(2))
print("\n复杂链式操作(添加列、筛选、分组聚合):")
print(result2)

2. 高效处理缺失值:不只是fillna和dropna

# 创建含缺失值的数据
df_nan = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, np.nan, 5],
    'C': [1, 2, 3, 4, 5],
    '分组': ['X', 'X', 'Y', 'Y', 'X']
})
print("原始数据:")
print(df_nan)

# 技巧1:向前/向后填充(特别适合时间序列)
print("\n向前填充:")
print(df_nan.fillna(method='ffill'))

print("\n向后填充:")
print(df_nan.fillna(method='bfill'))

# 技巧2:分组填充(按组别使用组内均值填充)
print("\n按分组用组内均值填充:")
df_nan['A'] = df_nan.groupby('分组')['A'].transform(
    lambda x: x.fillna(x.mean())
)
print(df_nan)

# 技巧3:插值法(适合有序数据)
df_time = pd.DataFrame({
    '日期': pd.date_range('2023-01-01', periods=10, freq='D'),
    '数值': [1, np.nan, np.nan, np.nan, 5, 6, np.nan, 8, np.nan, 10]
})
df_time.set_index('日期', inplace=True)
print("\n插值法填充:")
print(df_time.interpolate(method='time'))  # 考虑时间间隔的插值

# 技巧4:多重填充策略
print("\n不同列使用不同填充策略:")
print(df_nan.fillna({
    'A': df_nan['A'].mean(),  # A列用均值填充
    'B': df_nan['B'].median(),  # B列用中位数填充
    'C': 0  # C列用0填充
}))

3. 高级数据透视:pivot_table的强大功能

# 创建销售数据示例
sales_data = pd.DataFrame({
    '日期': pd.date_range('2023-01-01', periods=30, freq='D').tolist() * 2,
    '产品': ['A'] * 30 + ['B'] * 30,
    '地区': np.random.choice(['北京', '上海', '广州'], 60),
    '销售员': np.random.choice(['张三', '李四', '王五'], 60),
    '销售额': np.random.randint(100, 1000, 60),
    '数量': np.random.randint(1, 20, 60)
})
sales_data['月份'] = sales_data['日期'].dt.month

print("原始销售数据(前10行):")
print(sales_data.head(10))

# 基础数据透视
print("\n1. 基础透视 - 各地区各产品的总销售额:")
pivot1 = pd.pivot_table(
    sales_data,
    values='销售额',
    index='地区',
    columns='产品',
    aggfunc='sum',
    fill_value=0
)
print(pivot1)

# 多维度聚合
print("\n2. 多维度聚合 - 各地区各产品的销售额均值和总量:")
pivot2 = pd.pivot_table(
    sales_data,
    values=['销售额', '数量'],
    index=['地区', '月份'],
    columns='产品',
    aggfunc={'销售额': ['mean', 'sum'], '数量': 'sum'},
    fill_value=0,
    margins=True,  # 添加总计
    margins_name='总计'
)
print(pivot2)

# 多重索引处理
print("\n3. 扁平化多重索引列:")
pivot_flat = pivot2.copy()
# 将多层列索引合并为单层
pivot_flat.columns = ['_'.join(col).strip() for col in pivot_flat.columns.values]
print(pivot_flat.head())

# 交叉表crosstab(用于频率统计)
print("\n4. 使用crosstab统计各地区销售员出现的频率:")
cross_tab = pd.crosstab(
    index=sales_data['地区'],
    columns=sales_data['销售员'],
    values=sales_data['销售额'],
    aggfunc='count',
    normalize='index'  # 按行标准化,显示比例
)
print(cross_tab.round(2))

综合实战:完整数据处理流程

# 综合示例:从原始数据到分析报告
# 1. 数据读取与清洗
df = pd.DataFrame({
    '订单号': range(1001, 1021),
    '客户ID': np.random.choice(['C001', 'C002', 'C003', 'C004', 'C005'], 20),
    '产品类别': np.random.choice(['电子产品', '服装', '食品', '书籍'], 20),
    '销售额': np.random.uniform(50, 500, 20).round(2),
    '订单日期': pd.date_range('2023-01-01', periods=20, freq='D'),
    '评分': np.random.choice([1, 2, 3, 4, 5, np.nan], 20, p=[0.05, 0.1, 0.15, 0.3, 0.35, 0.05])
})

# 2. 使用链式操作进行完整处理
analysis_report = (
    df
    # 数据清洗
    .assign(订单日期=lambda x: pd.to_datetime(x['订单日期']),
            月份=lambda x: x['订单日期'].dt.month)
    .fillna({'评分': df['评分'].median()})  # 用中位数填充评分缺失值

    # 添加衍生指标
    .assign(销售额区间=lambda x: pd.cut(x['销售额'], 
                                    bins=[0, 100, 300, 500],
                                    labels=['低', '中', '高']))

    # 数据筛选
    .query('销售额 > 100')

    # 数据透视分析
    .pivot_table(
        values='销售额',
        index=['月份', '产品类别'],
        columns='销售额区间',
        aggfunc=['count', 'sum', 'mean'],
        fill_value=0,
        margins=True
    )

    # 结果格式化
    .round(2)
    .sort_values(by=('count', '高'), ascending=False)
)

print("数据分析报告:")
print(analysis_report)

# 3. 结果导出
analysis_report.to_excel('销售分析报告.xlsx')
print("\n分析报告已保存为 '销售分析报告.xlsx'")

总结

链式操作:使代码更简洁、易读,减少中间变量 智能处理缺失值:根据数据特征选择合适的填充策略 高级数据透视:使用pivot_table进行多维度分析,结合crosstab进行频率统计

这些技巧能显著提升数据处理效率和代码可维护性。建议在实际工作中多练习,根据具体场景灵活应用。

相关帖子
个人养老金每年12000元的缴费上限,未来有可能根据情况提高吗?
个人养老金每年12000元的缴费上限,未来有可能根据情况提高吗?
智能日程管理工具是如何通过习惯学习优化工作流程的?
智能日程管理工具是如何通过习惯学习优化工作流程的?
澄迈县搜索引擎优化@网站优化服务公司,专业建站公司
澄迈县搜索引擎优化@网站优化服务公司,专业建站公司
澄迈县企业商城建设#商城网站定制开发,提供一站式建站服务
澄迈县企业商城建设#商城网站定制开发,提供一站式建站服务
澄迈县品牌网站搭建|网站SEO优化,企业解决方案
澄迈县品牌网站搭建|网站SEO优化,企业解决方案
在快节奏的现代生活中,维护亲密关系面临哪些新的挑战与机遇?
在快节奏的现代生活中,维护亲密关系面临哪些新的挑战与机遇?
旅行或出差时,如何高效便捷地完成睡前口腔清洁的整套流程?
旅行或出差时,如何高效便捷地完成睡前口腔清洁的整套流程?
赡养老人、子女教育等专项附加扣除,填报时需要准备哪些材料?
赡养老人、子女教育等专项附加扣除,填报时需要准备哪些材料?
现在的
现在的"新中式澡堂"加了茶饮书吧,还是你记忆里那个澡堂子吗?
2026年的智能公交站牌,相比过去提供了哪些更丰富的出行信息服务?
2026年的智能公交站牌,相比过去提供了哪些更丰富的出行信息服务?
净水器滤芯到期未更换反而会造成水质污染是真的吗
净水器滤芯到期未更换反而会造成水质污染是真的吗
房子抵押贷款合同遗失怎么办?补办流程、法律效力与复印件使用范围
房子抵押贷款合同遗失怎么办?补办流程、法律效力与复印件使用范围
红白理事会的工作成效如何衡量,村民的满意度调查通常怎么进行?
红白理事会的工作成效如何衡量,村民的满意度调查通常怎么进行?
补办社保卡需要缴纳工本费吗?具体的费用标准是否有统一规定?
补办社保卡需要缴纳工本费吗?具体的费用标准是否有统一规定?
房产证上的面积存在微小误差,是否属于普遍现象以及合理的误差范围是多少?
房产证上的面积存在微小误差,是否属于普遍现象以及合理的误差范围是多少?
太阳能、风能等可再生能源的发展,对国际石油市场的需求预期有何影响?
太阳能、风能等可再生能源的发展,对国际石油市场的需求预期有何影响?
2026年,是否有更智能、更安全的方式替代传统的纸质信息卡?
2026年,是否有更智能、更安全的方式替代传统的纸质信息卡?
办理房子抵押贷款流程中房子能住吗?抵押期间权益解析
办理房子抵押贷款流程中房子能住吗?抵押期间权益解析
面对墙壁和地面“冒水”的现象,正确的应急处理步骤应该是怎样的?
面对墙壁和地面“冒水”的现象,正确的应急处理步骤应该是怎样的?
2026年,是否有更便捷的官方数字平台可帮助劳动者查询和确认自己的薪酬记录?
2026年,是否有更便捷的官方数字平台可帮助劳动者查询和确认自己的薪酬记录?