31. concat 拼接1. 概述concat是 Pandas 中用于拼接多个 DataFrame 或 Series 的函数可以沿行方向垂直拼接或列方向水平拼接进行合并。importpandasaspdimportnumpyasnp# 创建示例数据df1pd.DataFrame({ID:[1,2,3],姓名:[张三,李四,王五],年龄:[25,30,28]})df2pd.DataFrame({ID:[4,5,6],姓名:[赵六,钱七,孙八],年龄:[32,35,27]})df3pd.DataFrame({ID:[7,8,9],姓名:[周九,吴十,郑十一],年龄:[29,31,33]})print(df1:)print(df1)print(\ndf2:)print(df2)print(\ndf3:)print(df3)2. 行拼接垂直拼接2.1 基本用法# 垂直拼接两个 DataFramedf_concatpd.concat([df1,df2])print(垂直拼接 df1 df2:)print(df_concat)# 垂直拼接多个 DataFramedf_concatpd.concat([df1,df2,df3])print(\n垂直拼接多个:)print(df_concat)print(f形状:{df_concat.shape})2.2 重置索引# 拼接后重置索引df_concatpd.concat([df1,df2],ignore_indexTrue)print(拼接后重置索引:)print(df_concat)3. 列拼接水平拼接3.1 基本用法# 创建不同列的数据df_leftpd.DataFrame({ID:[1,2,3],姓名:[张三,李四,王五]})df_rightpd.DataFrame({年龄:[25,30,28],城市:[北京,上海,广州]})# 水平拼接print(df_left:)print(df_left)print(\ndf_right:)print(df_right)resultpd.concat([df_left,df_right],axis1)print(\n水平拼接:)print(result)3.2 索引对齐# 索引不对齐时的拼接df_apd.DataFrame({值:[1,2,3]},index[a,b,c])df_bpd.DataFrame({值:[4,5,6]},index[b,c,d])print(df_a:)print(df_a)print(\ndf_b:)print(df_b)# 默认按索引对齐resultpd.concat([df_a,df_b],axis1)print(\n索引对齐拼接:)print(result)4. 处理列不一致4.1 不同列名的拼接df_xpd.DataFrame({A:[1,2,3],B:[4,5,6]})df_ypd.DataFrame({A:[7,8,9],C:[10,11,12]})print(df_x:)print(df_x)print(\ndf_y:)print(df_y)# 默认填充缺失值为 NaNresultpd.concat([df_x,df_y])print(\n拼接列不一致:)print(result)4.2 处理缺失值# 只保留共有的列resultpd.concat([df_x,df_y],joininner)print(只保留共有列:)print(result)# 使用 outer 保留所有列默认resultpd.concat([df_x,df_y],joinouter)print(\n保留所有列:)print(result)5. 添加层级索引# 使用 keys 添加层级索引resultpd.concat([df1,df2,df3],keys[第一批,第二批,第三批])print(添加层级索引:)print(result)# 访问特定层级print(\n访问第二批数据:)print(result.loc[第二批])6. 完整示例销售数据合并# 创建多个月份的销售数据np.random.seed(42)# 1月数据janpd.DataFrame({日期:pd.date_range(2024-01-01,periods10,freqD),产品:[产品A,产品B,产品A,产品C,产品B,产品A,产品C,产品B,产品A,产品C],销售额:np.random.randint(1000,5000,10),销量:np.random.randint(10,100,10)})# 2月数据febpd.DataFrame({日期:pd.date_range(2024-02-01,periods10,freqD),产品:[产品A,产品B,产品A,产品C,产品B,产品A,产品C,产品B,产品A,产品C],销售额:np.random.randint(1000,5000,10),销量:np.random.randint(10,100,10)})# 3月数据marpd.DataFrame({日期:pd.date_range(2024-03-01,periods10,freqD),产品:[产品A,产品B,产品A,产品C,产品B,产品A,产品C,产品B,产品A,产品C],销售额:np.random.randint(1000,5000,10),销量:np.random.randint(10,100,10)})print(*60)print(销售数据合并)print(*60)print(\n1月数据:)print(jan.head())print(\n2月数据:)print(feb.head())# 1. 垂直拼接所有月份print(\n1. 合并 Q1 数据:)q1_salespd.concat([jan,feb,mar],ignore_indexTrue)print(fQ1 数据形状:{q1_sales.shape})print(q1_sales.head())# 2. 添加月份标识q1_sales_labeledpd.concat([jan,feb,mar],keys[1月,2月,3月])print(\n2. 带月份标识的合并:)print(q1_sales_labeled.head(6))# 3. 按月份汇总print(\n3. 各月销售额汇总:)monthly_totalq1_sales_labeled.groupby(level0)[销售额].sum()print(monthly_total)# 4. 不同结构的数据合并# 创建包含不同列的数据extra_infopd.DataFrame({产品:[产品A,产品B,产品C],单价:[120,80,150],成本:[80,50,100]})print(\n4. 产品信息:)print(extra_info)# 注意这里只是示例实际需要 merge 而不是 concat7. concat 参数详解参数说明默认值objs要拼接的 DataFrame/Series 列表必填axis0行拼接1列拼接0join‘outer’并集‘inner’交集‘outer’ignore_index是否重置索引Falsekeys添加层级索引Nonelevels层级索引的级别Nonenames层级索引的名称Noneverify_integrity检查索引是否重复Falsesort是否排序列False8. 总结操作方法示例垂直拼接concat([df1, df2])pd.concat([df1, df2])垂直拼接重置索引concat([df1, df2], ignore_indexTrue)pd.concat([df1, df2], ignore_indexTrue)水平拼接concat([df1, df2], axis1)pd.concat([df1, df2], axis1)添加层级索引concat([df1, df2], keys[A,B])pd.concat([df1, df2], keys[A,B])只保留共有列concat([df1, df2], joininner)pd.concat([df1, df2], joininner)
模块六-数据合并与连接——31. concat 拼接
31. concat 拼接1. 概述concat是 Pandas 中用于拼接多个 DataFrame 或 Series 的函数可以沿行方向垂直拼接或列方向水平拼接进行合并。importpandasaspdimportnumpyasnp# 创建示例数据df1pd.DataFrame({ID:[1,2,3],姓名:[张三,李四,王五],年龄:[25,30,28]})df2pd.DataFrame({ID:[4,5,6],姓名:[赵六,钱七,孙八],年龄:[32,35,27]})df3pd.DataFrame({ID:[7,8,9],姓名:[周九,吴十,郑十一],年龄:[29,31,33]})print(df1:)print(df1)print(\ndf2:)print(df2)print(\ndf3:)print(df3)2. 行拼接垂直拼接2.1 基本用法# 垂直拼接两个 DataFramedf_concatpd.concat([df1,df2])print(垂直拼接 df1 df2:)print(df_concat)# 垂直拼接多个 DataFramedf_concatpd.concat([df1,df2,df3])print(\n垂直拼接多个:)print(df_concat)print(f形状:{df_concat.shape})2.2 重置索引# 拼接后重置索引df_concatpd.concat([df1,df2],ignore_indexTrue)print(拼接后重置索引:)print(df_concat)3. 列拼接水平拼接3.1 基本用法# 创建不同列的数据df_leftpd.DataFrame({ID:[1,2,3],姓名:[张三,李四,王五]})df_rightpd.DataFrame({年龄:[25,30,28],城市:[北京,上海,广州]})# 水平拼接print(df_left:)print(df_left)print(\ndf_right:)print(df_right)resultpd.concat([df_left,df_right],axis1)print(\n水平拼接:)print(result)3.2 索引对齐# 索引不对齐时的拼接df_apd.DataFrame({值:[1,2,3]},index[a,b,c])df_bpd.DataFrame({值:[4,5,6]},index[b,c,d])print(df_a:)print(df_a)print(\ndf_b:)print(df_b)# 默认按索引对齐resultpd.concat([df_a,df_b],axis1)print(\n索引对齐拼接:)print(result)4. 处理列不一致4.1 不同列名的拼接df_xpd.DataFrame({A:[1,2,3],B:[4,5,6]})df_ypd.DataFrame({A:[7,8,9],C:[10,11,12]})print(df_x:)print(df_x)print(\ndf_y:)print(df_y)# 默认填充缺失值为 NaNresultpd.concat([df_x,df_y])print(\n拼接列不一致:)print(result)4.2 处理缺失值# 只保留共有的列resultpd.concat([df_x,df_y],joininner)print(只保留共有列:)print(result)# 使用 outer 保留所有列默认resultpd.concat([df_x,df_y],joinouter)print(\n保留所有列:)print(result)5. 添加层级索引# 使用 keys 添加层级索引resultpd.concat([df1,df2,df3],keys[第一批,第二批,第三批])print(添加层级索引:)print(result)# 访问特定层级print(\n访问第二批数据:)print(result.loc[第二批])6. 完整示例销售数据合并# 创建多个月份的销售数据np.random.seed(42)# 1月数据janpd.DataFrame({日期:pd.date_range(2024-01-01,periods10,freqD),产品:[产品A,产品B,产品A,产品C,产品B,产品A,产品C,产品B,产品A,产品C],销售额:np.random.randint(1000,5000,10),销量:np.random.randint(10,100,10)})# 2月数据febpd.DataFrame({日期:pd.date_range(2024-02-01,periods10,freqD),产品:[产品A,产品B,产品A,产品C,产品B,产品A,产品C,产品B,产品A,产品C],销售额:np.random.randint(1000,5000,10),销量:np.random.randint(10,100,10)})# 3月数据marpd.DataFrame({日期:pd.date_range(2024-03-01,periods10,freqD),产品:[产品A,产品B,产品A,产品C,产品B,产品A,产品C,产品B,产品A,产品C],销售额:np.random.randint(1000,5000,10),销量:np.random.randint(10,100,10)})print(*60)print(销售数据合并)print(*60)print(\n1月数据:)print(jan.head())print(\n2月数据:)print(feb.head())# 1. 垂直拼接所有月份print(\n1. 合并 Q1 数据:)q1_salespd.concat([jan,feb,mar],ignore_indexTrue)print(fQ1 数据形状:{q1_sales.shape})print(q1_sales.head())# 2. 添加月份标识q1_sales_labeledpd.concat([jan,feb,mar],keys[1月,2月,3月])print(\n2. 带月份标识的合并:)print(q1_sales_labeled.head(6))# 3. 按月份汇总print(\n3. 各月销售额汇总:)monthly_totalq1_sales_labeled.groupby(level0)[销售额].sum()print(monthly_total)# 4. 不同结构的数据合并# 创建包含不同列的数据extra_infopd.DataFrame({产品:[产品A,产品B,产品C],单价:[120,80,150],成本:[80,50,100]})print(\n4. 产品信息:)print(extra_info)# 注意这里只是示例实际需要 merge 而不是 concat7. concat 参数详解参数说明默认值objs要拼接的 DataFrame/Series 列表必填axis0行拼接1列拼接0join‘outer’并集‘inner’交集‘outer’ignore_index是否重置索引Falsekeys添加层级索引Nonelevels层级索引的级别Nonenames层级索引的名称Noneverify_integrity检查索引是否重复Falsesort是否排序列False8. 总结操作方法示例垂直拼接concat([df1, df2])pd.concat([df1, df2])垂直拼接重置索引concat([df1, df2], ignore_indexTrue)pd.concat([df1, df2], ignore_indexTrue)水平拼接concat([df1, df2], axis1)pd.concat([df1, df2], axis1)添加层级索引concat([df1, df2], keys[A,B])pd.concat([df1, df2], keys[A,B])只保留共有列concat([df1, df2], joininner)pd.concat([df1, df2], joininner)