欢迎光临澄迈县白事服务网
详情描述
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进行频率统计

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

相关帖子
智能日程管理工具是如何通过习惯学习优化工作流程的?
智能日程管理工具是如何通过习惯学习优化工作流程的?
澄迈县搜索引擎优化@网站优化服务公司,专业建站公司
澄迈县搜索引擎优化@网站优化服务公司,专业建站公司
澄迈县企业商城建设#商城网站定制开发,提供一站式建站服务
澄迈县企业商城建设#商城网站定制开发,提供一站式建站服务
澄迈县品牌网站搭建|网站SEO优化,企业解决方案
澄迈县品牌网站搭建|网站SEO优化,企业解决方案
参加2026年好友婚礼,红包金额究竟给多少才算既体面又不失分寸?
参加2026年好友婚礼,红包金额究竟给多少才算既体面又不失分寸?
马桶旁装哪种扶手更稳,普通毛巾架能不能临时借力,承重和安全差别在哪?
马桶旁装哪种扶手更稳,普通毛巾架能不能临时借力,承重和安全差别在哪?
在跨境或涉及多地区资产的情况下,遗嘱执行人需要特别注意什么?
在跨境或涉及多地区资产的情况下,遗嘱执行人需要特别注意什么?
未来关于离婚冷静期的讨论和完善,可能会朝着哪个方向继续发展?
未来关于离婚冷静期的讨论和完善,可能会朝着哪个方向继续发展?
当我们决定暂停某项订阅时,服务提供商通常设置了哪些障碍?
当我们决定暂停某项订阅时,服务提供商通常设置了哪些障碍?
2026年是否有将古树名木认养与个人碳账户挂钩的新趋势或探索?
2026年是否有将古树名木认养与个人碳账户挂钩的新趋势或探索?
自建房有房产证土地证吗,集体土地房产不能上市抵押
自建房有房产证土地证吗,集体土地房产不能上市抵押
如果认为在海外受到了不公正对待,如何通过领事保护渠道进行反映和投诉?
如果认为在海外受到了不公正对待,如何通过领事保护渠道进行反映和投诉?
如果发现自己的电子身份证信息被冒用,个人应该通过哪些渠道和步骤进行申诉?
如果发现自己的电子身份证信息被冒用,个人应该通过哪些渠道和步骤进行申诉?
有哪些与本命年相关的文创产品或设计,融合了传统与现代元素?
有哪些与本命年相关的文创产品或设计,融合了传统与现代元素?
未来税务监管更加数字化,对个人经营所得的申报会有哪些新要求?
未来税务监管更加数字化,对个人经营所得的申报会有哪些新要求?
育儿假到底是什么意思?它和产假、陪产假最核心的区别在哪里?
育儿假到底是什么意思?它和产假、陪产假最核心的区别在哪里?
2026年新业态从业者的工伤保障政策有何新进展与具体规定?
2026年新业态从业者的工伤保障政策有何新进展与具体规定?
探讨取消公摊面积政策在具体执行过程中,可能会遇到哪些实际层面的困难与挑战?
探讨取消公摊面积政策在具体执行过程中,可能会遇到哪些实际层面的困难与挑战?
因所在行业衰落而失业再就业困难的职工,可以转向哪些新兴领域?
因所在行业衰落而失业再就业困难的职工,可以转向哪些新兴领域?