欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【AI Study】第四天,Pandas(3)- 数据处理进阶

【AI Study】第四天,Pandas(3)- 数据处理进阶

2025/6/19 18:34:37 来源:https://blog.csdn.net/tearofthemyth/article/details/148749255  浏览:    关键词:【AI Study】第四天,Pandas(3)- 数据处理进阶

文章概要

本文详细介绍 Pandas 的进阶数据处理技术,包括:

  • 数据转换
  • 数据合并
  • 数据分组
  • 数据透视
  • 实际应用示例

数据转换

数据类型转换

# 查看数据类型
df.dtypes# 转换数据类型
df['列名'] = df['列名'].astype('int64')
df['列名'] = df['列名'].astype('float64')
df['列名'] = df['列名'].astype('str')
df['列名'] = pd.to_datetime(df['列名'])# 使用 to_numeric 转换
df['列名'] = pd.to_numeric(df['列名'], errors='coerce')

数据格式转换

# 日期格式转换
df['日期'] = pd.to_datetime(df['日期'])
df['日期'] = df['日期'].dt.strftime('%Y-%m-%d')# 字符串格式转换
df['列名'] = df['列名'].str.upper()
df['列名'] = df['列名'].str.lower()
df['列名'] = df['列名'].str.strip()
df['列名'] = df['列名'].str.replace('旧值', '新值')

数据重塑

# 宽格式转长格式
df_long = pd.melt(df, id_vars=['ID'], value_vars=['列1', '列2'],var_name='变量名',value_name='值')# 长格式转宽格式
df_wide = df_long.pivot(index='ID',columns='变量名',values='值')# 堆叠和反堆叠
df_stacked = df.stack()
df_unstacked = df_stacked.unstack()

数据合并

concat 操作

# 垂直合并(按行)
df_concat = pd.concat([df1, df2], axis=0)# 水平合并(按列)
df_concat = pd.concat([df1, df2], axis=1)# 设置索引
df_concat = pd.concat([df1, df2], ignore_index=True)# 使用键
df_concat = pd.concat([df1, df2], keys=['df1', 'df2'])

merge 操作

# 内连接
df_merged = pd.merge(df1, df2, on='键列')# 左连接
df_merged = pd.merge(df1, df2, on='键列', how='left')# 右连接
df_merged = pd.merge(df1, df2, on='键列', how='right')# 外连接
df_merged = pd.merge(df1, df2, on='键列', how='outer')# 使用多个键
df_merged = pd.merge(df1, df2, on=['键1', '键2'])

join 操作

# 使用索引连接
df_joined = df1.join(df2)# 指定连接方式
df_joined = df1.join(df2, how='left')# 使用列作为索引
df_joined = df1.set_index('键列').join(df2.set_index('键列'))

数据分组

groupby 操作

# 基本分组
grouped = df.groupby('列名')# 多列分组
grouped = df.groupby(['列1', '列2'])# 使用函数分组
grouped = df.groupby(lambda x: x.year)# 使用字典分组
grouped = df.groupby({'A': '组1', 'B': '组1', 'C': '组2'})

聚合函数

# 基本聚合
df.groupby('列名').sum()
df.groupby('列名').mean()
df.groupby('列名').count()# 多函数聚合
df.groupby('列名').agg(['sum', 'mean', 'count'])# 自定义聚合
df.groupby('列名').agg({'列1': 'sum','列2': ['mean', 'std']
})# 使用自定义函数
def custom_agg(x):return x.max() - x.min()df.groupby('列名').agg(custom_agg)

转换函数

# 标准化
df.groupby('列名').transform(lambda x: (x - x.mean()) / x.std())# 填充缺失值
df.groupby('列名').transform(lambda x: x.fillna(x.mean()))# 排名
df.groupby('列名').transform('rank')

过滤函数

# 过滤条件
df.groupby('列名').filter(lambda x: x['值'].mean() > 100)# 大小过滤
df.groupby('列名').filter(lambda x: len(x) > 10)# 多条件过滤
df.groupby('列名').filter(lambda x: (x['值1'].mean() > 100) & (x['值2'].std() < 50))

数据透视

pivot 操作

# 基本透视
df_pivot = df.pivot(index='行索引',columns='列索引',values='值')# 多值透视
df_pivot = df.pivot(index='行索引',columns='列索引',values=['值1', '值2'])

pivot_table 操作

# 基本透视表
df_pivot = pd.pivot_table(df,index='行索引',columns='列索引',values='值',aggfunc='mean')# 多聚合函数
df_pivot = pd.pivot_table(df,index='行索引',columns='列索引',values='值',aggfunc=['mean', 'sum', 'count'])# 填充缺失值
df_pivot = pd.pivot_table(df,index='行索引',columns='列索引',values='值',fill_value=0)

crosstab 操作

# 基本交叉表
df_cross = pd.crosstab(df['行'], df['列'])# 添加合计
df_cross = pd.crosstab(df['行'], df['列'], margins=True)# 使用聚合函数
df_cross = pd.crosstab(df['行'], df['列'], values=df['值'], aggfunc='mean')# 标准化
df_cross = pd.crosstab(df['行'], df['列'], normalize='index')

实际应用示例

示例1:销售数据分析

# 创建示例数据
sales = pd.DataFrame({'日期': pd.date_range('2023-01-01', periods=10),'产品': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'B', 'A', 'C'],'地区': ['北京', '上海', '广州', '北京', '上海', '广州', '北京', '上海', '广州', '北京'],'销量': [100, 150, 120, 80, 200, 90, 110, 180, 130, 95],'单价': [10, 15, 10, 20, 15, 10, 20, 15, 10, 20]
})# 计算销售额
sales['销售额'] = sales['销量'] * sales['单价']# 按产品和地区分组统计
product_region_stats = sales.groupby(['产品', '地区']).agg({'销量': 'sum','销售额': 'sum'
}).round(2)# 创建透视表
pivot_table = pd.pivot_table(sales,index='产品',columns='地区',values='销售额',aggfunc='sum',margins=True)print("分组统计结果:")
print(product_region_stats)
print("\n透视表结果:")
print(pivot_table)

示例2:学生成绩分析

# 创建示例数据
grades = pd.DataFrame({'班级': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'] * 2,'科目': ['语文', '语文', '数学', '数学', '英语', '英语', '物理', '物理'] * 2,'学生': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十'] * 2,'成绩': [85, 92, 78, 88, 95, 82, 90, 87, 88, 85, 92, 78, 88, 95, 82, 90]
})# 按班级和科目分组计算统计量
class_subject_stats = grades.groupby(['班级', '科目']).agg({'成绩': ['mean', 'std', 'min', 'max', 'count']
}).round(2)# 创建交叉表
cross_tab = pd.crosstab(grades['班级'], grades['科目'], values=grades['成绩'], aggfunc='mean')print("班级科目统计结果:")
print(class_subject_stats)
print("\n交叉表结果:")
print(cross_tab)

总结

数据处理进阶部分涵盖了:

  1. 数据转换技术
  2. 数据合并方法
  3. 数据分组和聚合
  4. 数据透视表操作
  5. 实际应用示例

这些进阶数据处理技术是进行复杂数据分析的基础。掌握这些技术可以帮助我们更好地处理和分析数据,发现数据中的规律和趋势。在实际应用中,这些技术往往需要结合使用,以达到最佳的分析效果。建议通过实际项目多加练习,熟悉各种方法的适用场景和组合使用方式。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词