数据合并操作详解

在数据分析和处理过程中,数据合并是一项常见且重要的操作。本文将详细介绍使用Python的pandas库进行数据合并的多种方法,并结合具体代码示例进行说明。

一、导入必要的库和动态构建数据目录路径

import pandas as pd
import os

# 获取当前工作目录
data_dir = os.getcwd()
print(data_dir)

代码解释
在这段代码中,os.getcwd()用来获取当前工作目录,接着直接在这个目录里查找user_all_info.csv文件。同时,使用try-except块来捕获FileNotFoundError异常,若文件不存在就输出错误信息。

二、读取用户所有信息数据

准备工作

在这里插入图片描述

# 读取用户所有信息数据
try:
    user_all_info = pd.read_csv('./user_all_info.csv',encoding='gbk')
    print("数据读取成功!")
except FileNotFoundError:
    print("错误:未在当前目录找到 'user_all_info.csv' 文件。")

在这里插入图片描述

代码解释

  • pd.read_csv()pandas中的方法,用于读取CSV文件。os.path.join(data_dir, 'user_all_info.csv')将数据目录路径和文件名拼接成完整的文件路径。

三、代码4 - 1:按列合并数据

在这里插入图片描述在这里插入图片描述

# 代码 4-1
df3 = user_all_info.iloc[:5, :3]  # 取出user_all_info前500行数据
df4 = user_all_info.iloc[2230:, :2]  # 取出user_all_info的500后的数据
print(df3)
print(df4)
print('合并df3的大小为%s,df4的大小为%s' % (df3.shape, df4.shape))
print('外连接纵向合并后的数据框大小为:', pd.concat([df3, df4], axis=0, join='outer').shape)
print('内连接纵向合并后的数据框大小为:', pd.concat([df3, df4], axis=0, join='inner').shape)
print('合并表后:外连接纵向合并后的数据框大小为:', pd.concat([df3, df4], axis=0, join='outer'))
print('合并表后:内连接纵向合并后的数据框大小为:', pd.concat([df3, df4], axis=0, join='inner'))

结果

在这里插入图片描述

在这里插入图片描述

代码解释

  • df1 = user_all_info.iloc[:, :3]:使用iloc方法选取user_all_info的前3列数据。
  • df2 = user_all_info.iloc[:, -1:]:使用iloc方法选取user_all_info的最后1列数据。
  • pd.concat():用于将多个DataFrame对象沿着指定轴进行拼接。
    • axis=1:表示按列拼接。
    • join='outer':外连接,合并时包含所有的行和列,缺失值用NaN填充。
    • join='inner':内连接,合并时只包含所有DataFrame对象都有的行和列。

在这里插入图片描述

四、代码4 - 2:按行合并数据

# 代码 4-2
df3 = user_all_info.iloc[:500, :]  # 取出user_all_info前500行数据
df4 = user_all_info.iloc[500:, :]  # 取出user_all_info的500后的数据
print('合并df3的大小为%s,df4的大小为%s' % (df3.shape, df4.shape))
print('外连接纵向合并后的数据框大小为:', pd.concat([df3, df4], axis=0, join='outer').shape)
print('内连接纵向合并后的数据框大小为:', pd.concat([df3, df4], axis=0, join='inner').shape)

代码解释

  • df3 = user_all_info.iloc[:500, :]:使用iloc方法选取user_all_info的前500行数据。
  • df4 = user_all_info.iloc[500:, :]:使用iloc方法选取user_all_info的第500行之后的数据。
  • pd.concat():按行拼接数据,axis=0表示按行拼接。

结果

在这里插入图片描述

五、代码4 - 3:使用append方法纵向堆叠数据 (弃用)

在这里插入图片描述

# 代码 4-3
print('堆叠前df3的大小为%s,df4的大小为%s' % (df3.shape, df4.shape))
print('append纵向堆叠后的数据框大小为:', df3.append(df4).shape)

代码解释

  • df3.append(df4)DataFrame对象的append方法,用于将另一个DataFrame对象纵向堆叠到当前DataFrame对象的末尾。

在新版的pandas中,DataFrameappend方法已被弃用 ,不再作为DataFrame对象的属性,所以会报'DataFrame' object has no attribute 'append'这个属性错误。

在这里插入图片描述

修改后代码

print('堆叠前df3的大小为%s,df4的大小为%s' % (df3.shape, df4.shape))
# 使用 pd.concat 替代 append
print('纵向堆叠后的数据框大小为:', pd.concat([df3, df4], axis=0).shape)

主键合并

在这里插入图片描述在这里插入图片描述

意图是先打印df3和df4形状,再通过append方法纵向堆叠二者并打印堆叠后数据框形状 ,但因append在新版pandas中被弃用而报错。

1.先构建df3和df4两个数据框,然后使用pd.concat函数将它们纵向拼接,最后打印拼接后数据框的形状,成功实现了纵向堆叠并获取形状。

2.使用pd.concat函数,这是新版pandas中推荐用于数据框拼接的方式 ,axis = 0明确指定纵向拼接,能正确实现纵向堆叠需求。

六、代码4 - 4:使用merge方法按主键合并数据

准备

在这里插入图片描述

1.merge函数的常用参数及其说明。

在这里插入图片描述在这里插入图片描述

# 代码 4-4
# 导入必要的库
# pandas 用于数据处理和分析
# os 用于处理文件路径和操作系统相关功能
# chardet 用于检测文件编码格式
import pandas as pd
import os
import chardet



pay_info = pd.read_csv('./user_pay_info.csv',encoding='utf-8')
download_info = pd.read_csv('./user_download.csv',encoding='GB2312')
# ---------------------- 合并数据框 ----------------------
# 合并下载信息和支付信息数据框
# left_on/right_on 指定左右数据框用于合并的键(列名)
# 这里左侧数据框的键是'用户编号',右侧数据框的键是'编号'(可能列名不同但含义相同)
download_and_pay = pd.merge(
    download_info,  # 左侧数据框(下载信息)
    pay_info,       # 右侧数据框(支付信息)
    left_on='用户编号',  # 左侧数据框的合并键
    right_on='编号'      # 右侧数据框的合并键
)

print(download_and_pay)


# ---------------------- 定义打印函数 ----------------------
# 定义函数用于打印数据框合并前后的形状信息
# 参数说明:
# df1_name/df2_name: 数据框的名称(字符串,用于显示)
# df1/df2: 原始数据框对象
# merge_method: 合并方式描述(字符串,如'主键')
# merge_result: 合并后的结果数据框
def print_merge_shape(df1_name, df2_name, df1, df2, merge_method, merge_result):
    print(f'{df1_name}的原始形状为:', df1.shape)       # 打印第一个数据框的形状(行数, 列数)
    print(f'{df2_name}的原始形状为:', df2.shape)       # 打印第二个数据框的形状
    print(f'{df1_name}{df2_name}{merge_method}合并后的形状为:', merge_result.shape)  # 打印合并结果的形状


# ---------------------- 调用函数输出结果 ----------------------
# 调用打印函数,传入数据框名称、对象、合并方式和结果
print_merge_shape(
    'download_info',  # 下载信息数据框的名称
    'pay_info',       # 支付信息数据框的名称
    download_info,    # 下载信息数据框对象
    pay_info,         # 支付信息数据框对象
    '主键',           # 合并方式描述(基于主键合并)
    download_and_pay  # 合并后的结果数据框
)



代码解释

  • pd.read_csv():读取user_pay_info.csvuser_download.csv文件。
  • pd.merge():用于根据指定的键将两个DataFrame对象合并。
    • left_on='用户编号':指定左DataFramedownload_info)中用于合并的列。
    • right_on='编号':指定右DataFramepay_info)中用于合并的列。
  • print_merge_shape:自定义函数,用于打印合并前后DataFrame对象的形状。

结果

在这里插入图片描述

七、代码4 - 5:使用join方法按主键合并数据

# 代码 4-5
pay_info.rename({'编号': '用户编号'}, inplace=True)
download_and_pay1 = download_info.join(pay_info, on='用户编号', rsuffix='1')
# 按照正确的参数顺序和数量调用函数
print_merge_shape('download_info', 'pay_info',
 download_info, pay_info, '主键', download_and_pay1)

代码解释

  • pay_info.rename({'编号': '用户编号'}, inplace=True):使用rename方法将pay_info中的编号列重命名为用户编号
  • download_info.join()DataFrame对象的join方法,用于根据指定的键将两个DataFrame对象合并。
    • on='用户编号':指定用于合并的列。
    • rsuffix='1':当两个DataFrame对象中有相同列名时,为右DataFrame中的列名添加后缀。

代码解释

在调用 print_merge_shape 函数时,依次传递了 df1_name(‘download_info’)、df2_name(‘pay_info’)、df1(download_info)、df2(pay_info)、merge_method(‘主键’)和 merge_result(download_and_pay1)这 6 个参数,这样就能正确调用函数并输出结果了。

结果

在这里插入图片描述

八、代码4 - 6:使用combine_first方法重叠合并数据

在这里插入图片描述

# 代码 4-6
import numpy as np
# 建立两个字典,除了ID外,别的特征互补
dict1 = {'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9],
         'System': ['win10', 'win10', np.nan, 'win10', np.nan, np.nan,
          'win7', 'win7', 'win8'],
         'cpu': ['i7', 'i5', np.nan, 'i7', np.nan, np.nan, 'i5', 'i5', 'i3']}
dict2 = {'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9],
         'System': [np.nan, np.nan, 'win7', 
         np.nan, 'win8', 'win7', np.nan, np.nan, np.nan],
         'cpu': [np.nan, np.nan, 'i3', np.nan, 'i7', 'i5', np.nan, np.nan, np.nan]}
# 变换两个字典为DataFrame
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
print('经过重叠合并后的数据为:\n', df1.combine_first(df2))

代码解释

  • import numpy as np:导入numpy库并将其重命名为npnumpy是一个用于科学计算的库,提供了数组和矩阵操作的方法。
  • pd.DataFrame():将字典转换为DataFrame对象。
  • df1.combine_first(df2)DataFrame对象的combine_first方法,用于将两个DataFrame对象进行重叠合并,当df1中存在缺失值时,用df2中对应位置的值进行填充。
  • 结果

  • 在这里插入图片描述

在这里插入图片描述

总结

通过本文的学习,可以掌握以下知识和技能:

  1. 学会使用pandas库读取CSV文件。
  2. 掌握concat方法按行和列合并数据的操作。
  3. 了解append方法纵向堆叠数据的使用。
  4. 学会使用mergejoin方法按主键合并数据。
  5. 掌握combine_first方法进行重叠合并数据的操作。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐