• 数据合并与对比


    深入浅出Pandas读书笔记

    C7 Pandas数据合并与对比

    7.1 数据追加 df.append

    The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

    7.2 数据链接 pd.concat

    7.2.1 基本语法

    pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, 
              levels=None, names=None, sort=False, verify_integrity=False, copy=True
    )
    
    • 1
    • 2
    • 3

    其中主要参数

    • objs 需要链接的数据, 可以是多个DataFrame或者Series
    • axis 链接轴的方法, 默认0
    • join 合并方式
    • ignore_index 是否保留原来的索引
    • keys 链接关系
    • names 索引的名称
    • verify_integrity 是否检测内容重复, 参数为True时, 如果合并的数据与原数据包含索引相同的行, 则会报错
    • copy 是否深拷贝

    7.2.2 简单链接

    pd.concat()的基本操作可以实现df.append()功能

    7.2.3 按列链接

    df1 = pd.DataFrame({'x': [1, 2], 'y': [3, 4]})
    df2 = pd.DataFrame({'x': [5, 6, 0], 'y': [7, 8, 0]})
    pd.concat([df1, df2], axis=1)
    
    • 1
    • 2
    • 3

    7.2.4 合并交集

    pd.concat([df1, df2], axis=1, join='inner')
    
    • 1

    7.2.5 与序列合并

    z = pd.Series([9, 9], name='z')
    pd.concat([df1, z], axis=1)
    # 但是还是建议使用df.assign()
    df1.assign(z=z)
    
    • 1
    • 2
    • 3
    • 4

    7.2.6 指定索引

    # 指定索引名, 合并
    pd.concat([df1, df2], keys=['df1', 'df2'])
    # 以字典形式, 指定列名合并
    pieces = {'df1': df1, 'df2': df2}
    pd.concat(pieces)
    # 横向合并
    pd.concat([df1, df2], axis=1, keys=['df1', 'df2'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7.2.7 多文件合并

    # 主要不要一个表格用一次concat, 这样性能会很差, 可以先把所有表格加到列表里, 然后一次性合并, 前提是你已经确定他们格式都是一样
    frames = [process_your_file(f) for f in files] # 将所有文件读成DataFrame, 放在list中
    result = pd.concat(frames)
    
    • 1
    • 2
    • 3

    7.2.8 目录文件合并

    # 去除目录下所有XLSX格式的文件
    files = glob.glob('*.xlsx') # 利用glob库找到复合条件的文件
    cols = ['ID', '时间', '名称'] # 只取这些列
    # 列表推导出对象
    dflist = [pd.read_excel(i, usecols=cols) for i in files]
    df = pd.concat(dflist)
    # 使用map函数进行操作
    pd.concat(map(pd.read_csv, ['d1.csv', 'd2.csv', 'd3.csv'])) # 并没有使用中间变量存储读出来的文件
    # 使用glob + map
    df = pd.concat(map(pd.read_excel, glob.glob('*.xlsx')))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    7.3 数据合并 pd.merge

    7.3.1 基本语法

    pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_inex=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
    
    • 1

    可以将两个DataFramem或Series合并, 最终返回一个DataFrame, 其中主要参数如下

    • left, right 需要链接的两个DataFrame或Series
    • how 链接方式
    • on 作为链接的字段, 左右数据中都必须存在
    • left_on, right_on
    • left_index, right_index
    • suffixes 如果出现重复列, 新数据表头会用此后缀区分, 默认_x, _y

    7.3.2 链接键

    在连接时, 如果没有指定根据哪一列进行连接, Pandas会自动找到相同列名的列进行连接, 并按左边数据的顺序取交集数据. 为了代码的可阅读性和严谨性, 推荐通过on参数指定链接键

    df1 = pd.DataFrame({'a': [1, 2], 'b': [5, 6]})
    df2 = pd.DataFrame({'a': [2, 1, 0], 'y': [6, 7, 8]})
    pd.merge(df1, df2, on='a')
    
    • 1
    • 2
    • 3

    7.3.3 索引链接

    pd.merge(df1, df2, left_index=True, right_index=True, suffixes=['_df1', '_df2'])
    
    • 1

    7.3.4 多链接键

    df3 = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'x': [5, 6]})
    df4 = pd.DataFrame({'a': [1, 2, 3], 'b': [3, 4, 5], 'y': [6, 7, 8]})
    pd.merge(df3, df4, on=['a', 'b'])
    
    • 1
    • 2
    • 3

    7.3.5 链接方法

    how参数可以指定数据用那种方法进行合并, 可以设置为inner, outer, left, right

    pd.merge(df3, df4, how='left', on=['a', 'b']) # 左连接
    right # 右链接
    inner # 内链接
    outer # 外连接
    
    • 1
    • 2
    • 3
    • 4

    7.3.6 链接指示

    如果想知道数据链接后是左表内容还是右表内容, 可以使用indicator参数显示链接方式, 设置indicator后会增加名为_merge的列, 显示这列是从何而来

    pd.merge(df1, df2, on='a', how='outer', indicator=True)
    '''
    a	b	y	_merge
    0	1	5.0	7	both
    1	2	6.0	6	both
    2	0	NaN	8	right_only
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7.4 按元素合并

    7.4.1 df.combine_first()

    使用相同位置的值更新空元素, 只有在df1有空元素时才能替换值, 如果数据结构不一致, 所得DataFrame的行索引和列索引将是两者的并集

    # df1中的A和B的空值被df2中相同位置的值替换
    df1 = pd.DataFrame({'A': [None, 1], 'B': [None, 2]})
    df2 = pd.DataFrame({'A': [3, 3], 'B': [4, 4]})
    df1.combine_first(df2)
    #
    df1 = pd.DataFrame({'A': [None, 1], 'B': [None, 2]})
    df2 = pd.DataFrame({'A': [3, 3], 'C': [4, 4]}, index=[1, 2])
    df1.combine_first(df2)
    '''
    A	B	C
    0	NaN	NaN	NaN
    1	1.0	2.0	4.0
    2	3.0	NaN	4.0
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    7.4.2 df.combine()

    可以与另一个DataFrame进行按列组合, 使用函数通过计算将一个DataFrame与其他DataFrame合并, 以逐元素方式合并. 所得DataFrame的行索引和列索引将是两者的并集.

    # 语法
    df1.combine(
        other: 'DataFrame',
        func,
        fill_value=None,
        overwrite: 'bool' = True,
    ) -> 'DataFrame'
    # 逐个元素传入, 一次对比, 按照func规则链接两个DataFrame
    df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
    df2 = pd.DataFrame({'A': [0, 3], 'B': [2, 1]})
    df1.combine(df2, lambda x1, x2: np.where(x1>x2, x1, x2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    7.4.3 df.update()

    可以使用来自另一个DataFrame的非NaN值来修改DataFrame, 原DataFrame被更新

    df1 = pd.DataFrame({'a': [None, 2], 'b': [5, 6]})
    df2 = pd.DataFrame({'a': [0, 2], 'b': [None, 7]})
    df1.update(df2)
    df1
    '''
    a	b
    0	0.0	5.0
    1	2.0	7.0
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7.5 数据对比 df.compare

  • 相关阅读:
    GRFB-UNet:一种新的多尺度注意力网络,用于铺路分割
    如何看待Unity新的收费模式?
    吊打面试官系列之:掌握了这166个Linux常用命令,面试官果然被我征服了。。
    公众版与政企版,这两款云电脑我都要
    幻兽帕鲁游戏搭建(docker)
    什么是外贸独立站,自己建独立站难不难?
    中科院预警名单
    【论文阅读】- 我对“AlexNet”的理解
    Vite项目的初体验 - 非Vite脚手架版本
    Dapr 与 NestJs ,实战编写一个 Pub & Sub 装饰器
  • 原文地址:https://blog.csdn.net/zhaoleiedu/article/details/127743307