Python之---【pandas】pd.concat(df)、df.append(df)

1.官网学习

学习的来源是官方网站,但是对于一些英文阅读能力较弱的童鞋,可能存在一些困难,在这里给出了官网的传送门,想深入了解的可以戳进去了解!
pandas.concat()
pandas.merging()

2.构造数据

为了后面演示方便,我现在会提前构造出一些数据,这些数据随手构造的,基本和平时用到的数据格式是一样的,如果觉得我造的数据比较丑,大家可以按照自己的喜好重新构造。下面介绍一下数据:

  • 数据分为三份,分别df1,df2,df3
  • df1、df3 为DataFrame
  • df2 为Series
  • 三份数据的index、column都进行了重新定义,index部分有重叠,column都不相同
#!/usr/bin/python3.6
# -*- coding:utf-8 -*-
 
"""
@author:    Ricky
"""
# 导入pandas 
import numpy as np
import pandas as pd
 # 数据 df1
data_1 = [[10, 20, 30, 40, 50], [11, 12, 13, 14, 15], [21, 22, 23, 24, 25], [31, 32, 33, 34, 35], [41, 42, 43, 44, 45]]
date_range1 = pd.date_range(start="20190301", periods=5)
df1 = pd.DataFrame(data=data_1, index=date_range1,
                  columns=['A', 'B', 'C', 'D', 'E'])
print(df1)
"""
             A   B   C   D   E
2019-03-02  10  20  30  40  50
2019-03-03  11  12  13  14  15
2019-03-04  21  22  23  24  25
2019-03-05  31  32  33  34  35
2019-03-06  41  42  43  44  45
"""
 # 数据df2
data_2 = [1, 2, 3, 4,5]
date_range2 = pd.date_range(start="20190302", periods=5)
df2 = pd.Series(data=data_2, index=date_range2, name='F')
print(df2)
"""
2019-03-02    1
2019-03-03    2
2019-03-04    3
2019-03-05    4
2019-03-06    5
"""
# 数据df2
data_3 = [['1a', '1b', '1c'], ['2a', '2b', '2c'], ['3a', '3b', '3c'], ['4a', '4b', '4c'], ['5a', '5b', '5c']]
date_range3 = pd.date_range(start="20190303", periods=5)
df3 = pd.DataFrame(data=data_3, index=date_range3, columns=['3G', '3H', '3M'])
print(df3)
"""
            3G  3H  3M
2019-03-03  1a  1b  1c
2019-03-04  2a  2b  2c
2019-03-05  3a  3b  3c
2019-03-06  4a  4b  4c
2019-03-07  5a  5b  5c
"""

2. 直接为DataFrame添加一列

将 Series 或 df 的一列直接赋给原始 df 作为一列,这里是直接添加,和使用pd.concat、df.append(df)不同,这种用法 pandas 会自动将插入的数据对齐到原始 df 的 index ,缺失值的地方为 NaN,index 之外的值将舍弃掉。

# 将df2全部插入到df1中,即:Series直接添加到DataFrame,注意index
df1["F"] = df2
print(df1)
"""
             A   B   C   D   E    F
2019-03-01  10  20  30  40  50  NaN
2019-03-02  11  12  13  14  15  1.0
2019-03-03  21  22  23  24  25  2.0
2019-03-04  31  32  33  34  35  3.0
2019-03-05  41  42  43  44  45  4.0
"""
 # 将df3中的两列插入到df1中,即:DataFrame直接添加到DataFrame,注意index
df1['3G'] = df3['3G']
df1['3H'] = df3['3H']
print(df1)
"""
             A   B   C   D   E    F   3G   3H
2019-03-01  10  20  30  40  50  NaN  NaN  NaN
2019-03-02  11  12  13  14  15  1.0  NaN  NaN
2019-03-03  21  22  23  24  25  2.0   1a   1b
2019-03-04  31  32  33  34  35  3.0   2a   2b
2019-03-05  41  42  43  44  45  4.0   3a   3b
"""

3. df.concat()

这种合并方法,将完整的保留数据(不会丢弃数据,而是根据 index 和 columns 增加行列),并可指定合并的轴。
完整的API:

pd.concat(objs, # 要合并对象
		axis=0, # 选择合并轴
		join='outer', # 连接方式,默认并集
		join_axes=None, 
		ignore_index=False,
        keys=None, 
        levels=None, 
        names=None, 
        verify_integrity=False,
        copy=True
          )

下面可以通过代码来看合并后的结果:

df4 = pd.concat([df1, df2, df3], axis=0)
print(df4)
"""
               A     B     C     D     E    F   3G   3H    0   3M
2019-03-01  10.0  20.0  30.0  40.0  50.0  NaN  NaN  NaN  NaN  NaN
2019-03-02  11.0  12.0  13.0  14.0  15.0  1.0  NaN  NaN  NaN  NaN
2019-03-03  21.0  22.0  23.0  24.0  25.0  2.0   1a   1b  NaN  NaN
2019-03-04  31.0  32.0  33.0  34.0  35.0  3.0   2a   2b  NaN  NaN
2019-03-05  41.0  42.0  43.0  44.0  45.0  4.0   3a   3b  NaN  NaN
2019-03-02   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  1.0  NaN
2019-03-03   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  2.0  NaN
2019-03-04   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  3.0  NaN
2019-03-05   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  4.0  NaN
2019-03-06   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  5.0  NaN
2019-03-03   NaN   NaN   NaN   NaN   NaN  NaN   1a   1b  NaN   1c
2019-03-04   NaN   NaN   NaN   NaN   NaN  NaN   2a   2b  NaN   2c
2019-03-05   NaN   NaN   NaN   NaN   NaN  NaN   3a   3b  NaN   3c
2019-03-06   NaN   NaN   NaN   NaN   NaN  NaN   4a   4b  NaN   4c
2019-03-07   NaN   NaN   NaN   NaN   NaN  NaN   5a   5b  NaN   5c
"""
 
df4 = pd.concat([df1, df2, df3], axis=1)
print(df4)
"""
               A     B     C     D     E    F   3G   3H    F   3G   3H   3M
2019-03-01  10.0  20.0  30.0  40.0  50.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2019-03-02  11.0  12.0  13.0  14.0  15.0  1.0  NaN  NaN  1.0  NaN  NaN  NaN
2019-03-03  21.0  22.0  23.0  24.0  25.0  2.0   1a   1b  2.0   1a   1b   1c
2019-03-04  31.0  32.0  33.0  34.0  35.0  3.0   2a   2b  3.0   2a   2b   2c
2019-03-05  41.0  42.0  43.0  44.0  45.0  4.0   3a   3b  4.0   3a   3b   3c
2019-03-06   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  5.0   4a   4b   4c
2019-03-07   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  NaN   5a   5b   5c
"""

下面是对合并的说明:

  • axis=0是按照列的方式合并,可以看到三块区域“自上至下”进行了合并,但是此时如果有相同的column就会合并在一起
  • axis=1是按照行的方式合并,可以看到三块区域“自左至右”进行了合并,但是此时如果有相同的index就会合并在一起
    图片说明

3.1 参数join

参数 join 默认为 join=‘outer’。如果改为 inner 则得到的是表的交集

# join 默认为 join='outer'。如果改为 inner 则得到的是表的交集
df5 = pd.concat([df1, df2, df3], axis=1, join='inner')
print(df5)
"""
             A   B   C   D   E    F  3G  3H  F  3G  3H  3M
2019-03-03  21  22  23  24  25  2.0  1a  1b  2  1a  1b  1c
2019-03-04  31  32  33  34  35  3.0  2a  2b  3  2a  2b  2c
2019-03-05  41  42  43  44  45  4.0  3a  3b  4  3a  3b  3c
"""

3.2 参数ignore_index

参数 ignore_index 默认为 False ,当设为 ignore_index=True 时,新 df 将不会使用拼接成员 df 的 index,而是重新生成一个从 0 开始的 index 值

df5 = pd.concat([df1, df2, df3], axis=0,ignore_index=True)
print(df5)
"""
      A     B     C     D     E    F   3G   3H    0   3M
0   10.0  20.0  30.0  40.0  50.0  NaN  NaN  NaN  NaN  NaN
1   11.0  12.0  13.0  14.0  15.0  1.0  NaN  NaN  NaN  NaN
2   21.0  22.0  23.0  24.0  25.0  2.0   1a   1b  NaN  NaN
3   31.0  32.0  33.0  34.0  35.0  3.0   2a   2b  NaN  NaN
4   41.0  42.0  43.0  44.0  45.0  4.0   3a   3b  NaN  NaN
5    NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  1.0  NaN
6    NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  2.0  NaN
7    NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  3.0  NaN
8    NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  4.0  NaN
9    NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  5.0  NaN
10   NaN   NaN   NaN   NaN   NaN  NaN   1a   1b  NaN   1c
11   NaN   NaN   NaN   NaN   NaN  NaN   2a   2b  NaN   2c
12   NaN   NaN   NaN   NaN   NaN  NaN   3a   3b  NaN   3c
13   NaN   NaN   NaN   NaN   NaN  NaN   4a   4b  NaN   4c
14   NaN   NaN   NaN   NaN   NaN  NaN   5a   5b  NaN   5c
"""
df5 = pd.concat([df1, df2, df3], axis=1,ignore_index=True)
print(df5)
"""
             0     1     2     3     4    5    6    7    8    9    10   11
2019-03-01  10.0  20.0  30.0  40.0  50.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2019-03-02  11.0  12.0  13.0  14.0  15.0  1.0  NaN  NaN  1.0  NaN  NaN  NaN
2019-03-03  21.0  22.0  23.0  24.0  25.0  2.0   1a   1b  2.0   1a   1b   1c
2019-03-04  31.0  32.0  33.0  34.0  35.0  3.0   2a   2b  3.0   2a   2b   2c
2019-03-05  41.0  42.0  43.0  44.0  45.0  4.0   3a   3b  4.0   3a   3b   3c
2019-03-06   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  5.0   4a   4b   4c
2019-03-07   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  NaN   5a   5b   5c
"""
  • 按列合并之后,index被重写定义了,简单来说:按照列合并的时候,column都是唯一的
  • 按行合并之后,column被重新定义了,同理:按照行合并的时候,index都是唯一的
    在这里插入图片描述

3.3 参数join_axes

参数 join_axes 可指定 index 来对齐数据。这样会切掉指定的 index 之外的数据

# 按照df1索引展示
df5 = pd.concat([df1, df2, df3], axis=1, join_axes=[df1.index])
print(df5)
"""
             A   B   C   D   E    F   3G   3H    F   3G   3H   3M
2019-03-01  10  20  30  40  50  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2019-03-02  11  12  13  14  15  1.0  NaN  NaN  1.0  NaN  NaN  NaN
2019-03-03  21  22  23  24  25  2.0   1a   1b  2.0   1a   1b   1c
2019-03-04  31  32  33  34  35  3.0   2a   2b  3.0   2a   2b   2c
2019-03-05  41  42  43  44  45  4.0   3a   3b  4.0   3a   3b   3c
"""
# 按照df2索引展示
df5 = pd.concat([df1, df2, df3], axis=1, join_axes=[df2.index])
print(df5)
"""
               A     B     C     D     E    F   3G   3H  F   3G   3H   3M
2019-03-02  11.0  12.0  13.0  14.0  15.0  1.0  NaN  NaN  1  NaN  NaN  NaN
2019-03-03  21.0  22.0  23.0  24.0  25.0  2.0   1a   1b  2   1a   1b   1c
2019-03-04  31.0  32.0  33.0  34.0  35.0  3.0   2a   2b  3   2a   2b   2c
2019-03-05  41.0  42.0  43.0  44.0  45.0  4.0   3a   3b  4   3a   3b   3c
2019-03-06   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  5   4a   4b   4c
"""
# 按照df3索引展示
df5 = pd.concat([df1, df2, df3], axis=1, join_axes=[df3.index])
print(df5)
"""
               A     B     C     D     E    F   3G   3H    F  3G  3H  3M
2019-03-03  21.0  22.0  23.0  24.0  25.0  2.0   1a   1b  2.0  1a  1b  1c
2019-03-04  31.0  32.0  33.0  34.0  35.0  3.0   2a   2b  3.0  2a  2b  2c
2019-03-05  41.0  42.0  43.0  44.0  45.0  4.0   3a   3b  4.0  3a  3b  3c
2019-03-06   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  5.0  4a  4b  4c
2019-03-07   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  NaN  5a  5b  5c
"""
# 自定义指定 start="20190301", periods=4
df5 = pd.concat([df1, df2, df3], axis=1, join_axes=[pd.date_range(start="20190301", periods=4)])
print(df5)
"""
             A   B   C   D   E    F   3G   3H    F   3G   3H   3M
2019-03-01  10  20  30  40  50  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2019-03-02  11  12  13  14  15  1.0  NaN  NaN  1.0  NaN  NaN  NaN
2019-03-03  21  22  23  24  25  2.0   1a   1b  2.0   1a   1b   1c
2019-03-04  31  32  33  34  35  3.0   2a   2b  3.0   2a   2b   2c
"""

4. df.append(df)

官方讲解

DataFrame.append(other, 
				ignore_index=False, 
				verify_integrity=False, 
				sort=None
				)

将被 append 的对象添加到调用者的末尾(类似 list 的方法)。
注意:如果调用者是 DataFrame 而被 append 的对象是 Series,将会把 Series 作为一行添加到末尾。Series 和 DataFrame 均有此方法。

# df3添加到df2的尾部
df1_append_df3 = df1.append(df3)
print(df1_append_df3)
"""
             3G   3H   3M     A     B     C     D     E    F
2019-03-01  NaN  NaN  NaN  10.0  20.0  30.0  40.0  50.0  NaN
2019-03-02  NaN  NaN  NaN  11.0  12.0  13.0  14.0  15.0  1.0
2019-03-03   1a   1b  NaN  21.0  22.0  23.0  24.0  25.0  2.0
2019-03-04   2a   2b  NaN  31.0  32.0  33.0  34.0  35.0  3.0
2019-03-05   3a   3b  NaN  41.0  42.0  43.0  44.0  45.0  4.0
2019-03-03   1a   1b   1c   NaN   NaN   NaN   NaN   NaN  NaN
2019-03-04   2a   2b   2c   NaN   NaN   NaN   NaN   NaN  NaN
2019-03-05   3a   3b   3c   NaN   NaN   NaN   NaN   NaN  NaN
2019-03-06   4a   4b   4c   NaN   NaN   NaN   NaN   NaN  NaN
2019-03-07   5a   5b   5c   NaN   NaN   NaN   NaN   NaN  NaN
"""
# df3添加到df2的尾部
df2_append_df3 = df2.append(df3)
print(df2_append_df3)
"""
              0   3G   3H   3M
2019-03-02  1.0  NaN  NaN  NaN
2019-03-03  2.0  NaN  NaN  NaN
2019-03-04  3.0  NaN  NaN  NaN
2019-03-05  4.0  NaN  NaN  NaN
2019-03-06  5.0  NaN  NaN  NaN
2019-03-03  NaN   1a   1b   1c
2019-03-04  NaN   2a   2b   2c
2019-03-05  NaN   3a   3b   3c
2019-03-06  NaN   4a   4b   4c
2019-03-07  NaN   5a   5b   5c
"""

可以看到数据是直接追加到,原始数据的尾部,对应的column是可以共用的,缺失的部分会使用NaN的方式对齐。
在这里插入图片描述

5.结束

  • 39
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值