• pandas合并数据集-【老鱼学pandas】


    有两个数据集,我们想把他们的结果根据相同的列名或索引号之类的进行合并,有点类似SQL中的从两个表中选择出不同的记录并进行合并返回。

    合并

    首先准备数据:

    import pandas as pd
    import numpy as np
    data0 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'])
    data1 = pd.DataFrame(np.ones((3, 4))*1, columns=['a', 'b', 'c', 'd'])
    data2 = pd.DataFrame(np.ones((3, 4))*2, columns=['a', 'b', 'c', 'd'])
    print("data0:")
    print(data0)
    
    print("data1:")
    print(data1)
    
    print("data2:")
    print(data2)
    
    

    输出为:

    data0:
         a    b    c    d
    0  0.0  0.0  0.0  0.0
    1  0.0  0.0  0.0  0.0
    2  0.0  0.0  0.0  0.0
    data1:
         a    b    c    d
    0  1.0  1.0  1.0  1.0
    1  1.0  1.0  1.0  1.0
    2  1.0  1.0  1.0  1.0
    data2:
         a    b    c    d
    0  2.0  2.0  2.0  2.0
    1  2.0  2.0  2.0  2.0
    2  2.0  2.0  2.0  2.0
    

    现在我们想把上面的这三个数据进行堆叠起来进行合并:

    print(pd.concat([data0, data1, data2]))
    

    输出为:

         a    b    c    d
    0  0.0  0.0  0.0  0.0
    1  0.0  0.0  0.0  0.0
    2  0.0  0.0  0.0  0.0
    0  1.0  1.0  1.0  1.0
    1  1.0  1.0  1.0  1.0
    2  1.0  1.0  1.0  1.0
    0  2.0  2.0  2.0  2.0
    1  2.0  2.0  2.0  2.0
    2  2.0  2.0  2.0  2.0
    

    忽略原始索引号

    如果我们想要把合并后的索引值成为连续的值,则需要增加参数ignore_index=True,忽略掉原始的索引,这样就能重建出新的索引:

    print(pd.concat([data0, data1, data2], ignore_index=True))
    

    输出为:

         a    b    c    d
    0  0.0  0.0  0.0  0.0
    1  0.0  0.0  0.0  0.0
    2  0.0  0.0  0.0  0.0
    3  1.0  1.0  1.0  1.0
    4  1.0  1.0  1.0  1.0
    5  1.0  1.0  1.0  1.0
    6  2.0  2.0  2.0  2.0
    7  2.0  2.0  2.0  2.0
    8  2.0  2.0  2.0  2.0
    

    横向合并

    默认情况下就是堆叠起来的合并方式,如果想要在列上进行合并,则只要设置axis=1属性就可以:

    print(pd.concat([data0, data1, data2], axis=1))
    

    输出为:

         a    b    c    d    a    b    c    d    a    b    c    d
    0  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
    1  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
    2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0  2.0  2.0  2.0  2.0
    

    联合查询

    有点类似SQL中的联合查询,也分为inner、outer join

    首先我们先准备一下数据:

    import pandas as pd
    import numpy as np
    data0 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
    data1 = pd.DataFrame(np.ones((3, 4))*1, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
    
    print("data0:")
    print(data0)
    
    print("data1:")
    print(data1)
    
    print("合并结果为:")
    print(pd.concat([data0, data1]))
    
    

    输出为:

    data0:
         a    b    c    d
    1  0.0  0.0  0.0  0.0
    2  0.0  0.0  0.0  0.0
    3  0.0  0.0  0.0  0.0
    data1:
         b    c    d    e
    2  1.0  1.0  1.0  1.0
    3  1.0  1.0  1.0  1.0
    4  1.0  1.0  1.0  1.0
    合并结果为:
         a    b    c    d    e
    1  0.0  0.0  0.0  0.0  NaN
    2  0.0  0.0  0.0  0.0  NaN
    3  0.0  0.0  0.0  0.0  NaN
    2  NaN  1.0  1.0  1.0  1.0
    3  NaN  1.0  1.0  1.0  1.0
    4  NaN  1.0  1.0  1.0  1.0
    

    在默认情况下,两个数据集的合并为堆叠方式进行合并,并且如果合并后有新的列,则新列中没有的值被设置为NaN。
    这种处理模式其实是设置了join='outer'的模式。
    如果我们把join模式修改成'inner',将会出现什么状况呢?

    print(pd.concat([data0, data1], join='inner'))
    

    输出为:

         b    c    d
    1  0.0  0.0  0.0
    2  0.0  0.0  0.0
    3  0.0  0.0  0.0
    2  1.0  1.0  1.0
    3  1.0  1.0  1.0
    4  1.0  1.0  1.0
    

    这样输出的结果相当于去除了NaN的列,返回了两个数据集中都有的列数据。

    join axes

    根据某数轴进行合并。
    例如:

    print(pd.concat([data0, data1], axis=1, join_axes=[data0.index]))
    

    输出为:

         a    b    c    d    b    c    d    e
    1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
    2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
    3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
    

    上面例子中根据data0的索引进行横向的合并,合并结果为只在data1中选择出跟data0相同index的值。

    如果我们没有使用join_axes的话,其输出为:

         a    b    c    d    b    c    d    e
    1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
    2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
    3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
    4  NaN  NaN  NaN  NaN  1.0  1.0  1.0  1.0
    

    也就是把两个数据集中相同的索引进行合并,同时添加上不相同的索引号

    用append添加数据

    print(data0.append(data1))
    

    输出为:

         a    b    c    d    e
    1  0.0  0.0  0.0  0.0  NaN
    2  0.0  0.0  0.0  0.0  NaN
    3  0.0  0.0  0.0  0.0  NaN
    2  NaN  1.0  1.0  1.0  1.0
    3  NaN  1.0  1.0  1.0  1.0
    4  NaN  1.0  1.0  1.0  1.0
    

    开起来跟默认的pd.contact()没什么区别,只是append可以用在数据对象上。

    添加一行数据

    添加用pd.Series()创建的一行数据:

    s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
    print("一行数据为:")
    print(s1)
    print("合并结果为:")
    print(data0.append(s1, ignore_index=True))
    

    输出为:

         a    b    c    d
    0  0.0  0.0  0.0  0.0
    1  0.0  0.0  0.0  0.0
    2  0.0  0.0  0.0  0.0
    3  1.0  2.0  3.0  4.0
    

    在新增Series数据时,必须要设置ignore_index=True。

  • 相关阅读:
    [安卓基础] 005.创建一个简单的UI
    [转]19张记录人类正在毁灭地球的照片
    SD.Team颜色代码大全
    [工具-004]如何从apk中提取AndroidManifest.xml并提取相应信息
    [Python番外]001.用Sublime开发Python
    [转]佛家四大经典爱情故事
    读Pyqt4教程,带你入门Pyqt4 _005
    读Pyqt4教程,带你入门Pyqt4 _004
    读Pyqt4教程,带你入门Pyqt4 _003
    [工具-003]如何从ipa中提取info.plist并提取相应信息
  • 原文地址:https://www.cnblogs.com/dreampursuer/p/7844395.html
Copyright © 2020-2023  润新知