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.结束

<think>嗯,用户的问题是关于使用pandasconcat函数合并两个列名相同的DataFrame。首先,我需要回想一下pandasconcat函数的使用方法,特别是当列名相同时的处理方式。根据之前学过的知识,concat默认是按行合并,也就是垂直堆叠,但用户可能想按列合并?或者他们可能遇到了列名重复的问题? 根据用户提供的引用内容,引用[1]提到concat有按行合并的功能,而appendconcat按行的简写。引用[3]则讨论了当axis=1时,按列合并的情况,并提到join参数可以控制索引的交集或并集。所以,如果用户的两个DataFrame列名相同,按列合并的话,结果可能会有重复的列名,这应该如何处理呢? 用户的问题中明确提到“合并两个列名相同的DataFrame”,可能需要的是按行合并,即垂直堆叠,这种情况下concat默认会保留所有行,而列名相同的列会自动对齐。例如,如果两个DataFrame都有列A、B、C,concat之后行数会增加,列还是这三个,数据会上下堆叠。这时候需要确认用户是否需要忽略索引,或者处理重复的索引,这时候可能需要设置ignore_index=True来重新生成索引。 但用户也可能在按列合并时遇到问题,即axis=1的情况,这时候如果列名相同,合并后的列名会重复,导致难以区分。这时候可能需要使用参数来处理,比如添加后缀,但concat函数本身可能没有直接提供后缀的参数,而join方法才有。例如,merge或者join函数可以使用lsuffix和rsuffix参数来区分左右DataFrame的列名。但用户使用的是concat,所以可能需要先处理列名,或者在合并后重命名列。 根据引用[3]中的例子,当axis=1且join='inner'时,会按列合并,取行索引的交集。但这里的问题在于列名相同的情况,可能用户希望合并后保留所有列,但如何处理重复的列名呢?这时候可能需要使用keys参数来添加多层索引,或者合并后手动修改列名。 另外,用户提供的引用[2]提到了join方法,可以合并不同的列索引,但用户明确提到使用concat函数。所以应该专注于concat的参数设置。 总结可能的解决方案: 1. 按行合并(默认axis=0):列名相同会自动对齐,上下堆叠数据。此时使用pd.concat([df1, df2], axis=0),可能需要设置ignore_index=True来重置索引。 2. 按列合并(axis=1):如果列名相同,会导致重复的列名,这时候可以设置keys参数来区分来源,例如pd.concat([df1, df2], axis=1, keys=['df1', 'df2']),这样列名会变成多层索引,如('df1', 'A')('df2', 'A')。或者,合并后使用后缀,但concat本身不支持后缀参数,可能需要其他方法。 或者,用户可能希望合并后覆盖相同的列,但通常这不会自动发生,需要进一步处理,比如使用groupby或其它方式去重。 但用户的问题可能更偏向于如何正确合并,并处理列名相同的情况。因此,正确的做法是明确合并的方向(行或列),并根据方向调整参数。 例如,如果用户希望垂直堆叠(行合并),则直接concat,列名相同的数据会自动合并到同一列下。如果用户希望水平合并(列合并),则会产生重复的列名,此时需要处理列名,比如添加前缀或后缀,或者使用多层索引。 根据用户提供的引用[3],当axis=1时,可以指定join参数来控制索引的交集或并集,但列名重复的问题需要另外处理。例如,用户可能需要合并两个具有相同列名的DataFrame,按列合并后,每个列会有两个副本,但列名相同,这时候可能需要手动调整列名,或者在concat时使用keys参数来区分来源。 因此,回答中应该分情况讨论:按行合并和按列合并的情况,并说明如何处理列名相同的问题。同时,根据用户提供的引用,可能需要提到使用ignore_index来重置索引,或者使用keys来区分来源,以及如何处理重复的列名。 可能的步骤: 1. 导入pandas库。 2. 创建两个示例DataFrame,具有相同的列名。 3. 使用concat按行合并,说明默认行为,列名相同的数据会被堆叠,可能需要重置索引。 4. 使用concat按列合并,说明列名重复的问题,并提供解决方案,如keys参数或后续重命名列。 5. 可能提到连接方式(join参数)的影响,比如inner或outer,决定索引的处理。 同时,根据引用[3]中的例子,当axis=1且join='inner'时,合并的是行索引的交集,但列名重复的问题仍然存在。因此,在处理列名重复时,可能需要结合其他方法。 最终,回答应指导用户根据需求选择合并方向,处理列名重复的情况,并给出代码示例。</think>使用`pandas.concat`合并两个列名相同的DataFrame时,需根据合并方向(行或列)调整参数。以下是具体方法: --- ### **1. 按行合并(垂直堆叠)** 若需将两个DataFrame上下拼接,保留所有列,直接使用`axis=0`(默认值)。列名相同时,数据会自动对齐到对应列: ```python import pandas as pd df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]}) result = pd.concat([df1, df2], axis=0, ignore_index=True) ``` 输出结果: ``` A B 0 1 3 1 2 4 2 5 7 3 5 8 ``` - `ignore_index=True`:重置索引,避免重复[^1]。 --- ### **2. 按列合并(水平堆叠)** 若需将两个DataFrame左右拼接,使用`axis=1`。若列名重复,需通过以下方法处理: #### **(1) 添加多层列索引** 用`keys`参数区分来源: ```python result = pd.concat([df1, df2], axis=1, keys=['df1', 'df2']) ``` 输出结果: ``` df1 df2 A B A B 0 1 3 5 7 1 2 4 6 8 ``` #### **(2) 重命名列** 合并后手动修改列名: ```python result = pd.concat([df1, df2], axis=1) result.columns = ['A1', 'B1', 'A2', 'B2'] ``` --- ### **3. 控制索引对齐方式** 通过`join`参数选择索引的合并方式: - `join='inner'`:仅保留索引的交集[^3]。 - `join='outer'`:保留索引的并集(默认值)。 ```python # 按列合并,仅保留共有索引 result = pd.concat([df1, df2], axis=1, join='inner') ``` --- ### **适用场景** - **垂直合并**:整合结构相同的数据(如多个月份的销售记录)。 - **水平合并**:关联同一批样本的不同特征(如用户ID与属性)[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值