【基本工具】S02E13 Pandas对象的简单数据合并

0.本集概览

1.Pandas数据对象按行、列两个维度进行拼接的方法
2.对象拼接合并时,行索引相同时的处理方法
3.对象拼接合并时,对列进行处理的方法

之前的几集,我们都是针对单一的Pandas数据结构进行操作,那么这一集开始,我们重点讨论如何对多个Pandas数据对象进行数据连接。这一集我们讨论如何利用concat方法进行简单的数据拼接。

1.按行维度进行拼接

代码片段:

import pandas as pd

ser1 = pd.Series(['A','B','C'], index=[1,2,3])
ser2 = pd.Series(['D','E','F'], index=[4,5,6])
ser = pd.concat([ser1,ser2])
print(ser1)
print(ser2)
print(ser)

运行结果:

1    A
2    B
3    C
dtype: object

4    D
5    E
6    F
dtype: object

1    A
2    B
3    C
4    D
5    E
6    F
dtype: object

在这个例子中,我们简单的对Series进行了拼接,我们看到默认的情况是逐行进行合并操作,对DataFrame对象进行简单拼接也是一样。
代码片段:

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'3':'A3','4':'A4'},'B':{'3':'B3','4':'B4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2]))

运行结果:

    A   B
1  A1  B1
2  A2  B2

    A   B
3  A3  B3
4  A4  B4

    A   B
1  A1  B1
2  A2  B2
3  A3  B3
4  A4  B4

通过这种方法,我们也是以逐行的方式对两个DataFrame进行了合并。

2.按列维度进行拼接

很自然的,相对于逐行进行合并,也可以按逐列的方式进行合并,类比之前讲过的,加上一个axis参数即可:
代码片段:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'C':{'1':'C1','2':'C4'},'D':{'1':'D1','2':'D2'}})
print(df1)
print(df2)
print(pd.concat([df1,df2], axis=1))

运行结果:

    A   B
1  A1  B1
2  A2  B2

    C   D
1  C1  D1
2  C4  D2

    A   B   C   D
1  A1  B1  C1  D1
2  A2  B2  C4  D2

3.行索引相同时的处理方法

上面的例子举得比较特殊,刻意设置了两个DataFrame数据的索引是不同的,如果恰好他们的索引相同,会不会出问题?

这个问题提的不错,Pandas中concat方法的一个很大的特点就是保留索引,合并后的结果里各行的索引与合并前的索引保持一致。
代码片段:

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})
print(pd.concat([df1,df2]))

运行结果:

    A   B
1  A1  B1
2  A2  B2
1  A3  B3
2  A4  B4

可以看到,结果并没有报错,而且确实是保留了合并前的索引。但是这并不是我们想看到的,因为这样一来,A1、A3两项的索引就是完全一样了。

那就眼睁睁的看着这种情况发生吗?

当然不是,解决的方法有两种:

第一种就是忽略这种索引,如果索引是这种没有实际意义的流水ID,那么我们可以让他们顺次的往下排列,从而避免重复,设置一个ignore_index即可实现。
代码片段:

import pandas as pd

df1 = pd.DataFrame({'A':{'1':'A1','2':'A2'},'B':{'1':'B1','2':'B2'}})
df2 = pd.DataFrame({'A':{'1':'A3','2':'A4'},'B':{'1':'B3','2':'B4'}})
print(df1)
print(df2)
print(pd.concat([df1,df2], ignore_index=True))

运行结果:

top Created with Sketch.