Pandas学习笔记六——合并数据集:Concat操作

合并数据集:Concat操作

#为了方便后面的演示,这里定义一个能够快速创建DataFrame的函数
import numpy as np
import pandas as pd

def make_df(cols, index):
    """一个简单的DataFrame"""
    data = {c:[str(c)+str(i) for i in index] for c in cols}
    return pd.DataFrame(data, index)
#通过pd.concat对Series实现合并
ser1 = pd.Series(['A', 'B', 'C'], index=[1,2,3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4,5,6])
pd.concat([ser1, ser2])

Out[111]: 
1    A
2    B
3    C
4    D
5    E
6    F
dtype: object

#通过pd.concat对DataFrame实现合并
df1 = make_df('AB', [1,2])
df2 = make_df('AB', [3,4])
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

实际应用中涉及的数据源并不会像上面举的两个例子一样简单。如果对复杂的数据源使用pd.concat()方法会出现下面两种需要解决的问题

1、索引重复

df3 = make_df('AB', [0,1])
df4 = make_df('AB', [0,1])
print(df3);print(df4); print(pd.concat([df3,df4]))

#输出结果:
    A   B
0  A0  B0
1  A1  B1
    A   B
0  A0  B0
1  A1  B1
    A   B
0  A0  B0
1  A1  B1
0  A0  B0
1  A1  B1

输出结果中合并之后的DataFrame保留了合并前两个成员的各自的索引,而这样重复的索引不是我们想要的。如果结果中的索引无关紧要,可以设置ignore_index参数来实现,如果将参数设为True,那么合并时将创建一个新的整数索引。

 print(pd.concat([df3,df4]), ignore_index=True)

 #输出结果
    A   B
0  A0  B0
1  A1  B1
2  A0  B0
3  A1  B1

另外一种解决索引重复的方法是通过keys参数为数据源设置多级索引标签,这样结果数据就会带上多级索引:

print(pd.concat([df3,df4], keys=['x', 'y']))

#输出结果:
      A   B
x 0  A0  B0
  1  A1  B1
y 0  A0  B0
  1  A1  B1
2、合并后出现NaN
df5 = make_df('ABC', [1,2])
df6 = make_df('BCD', [3,4])
print(df5);print(df6);print(pd.concat([df5,df6]))

#输出结果:
     A   B   C    D
1   A1  B1  C1  NaN
2   A2  B2  C2  NaN
3  NaN  B3  C3   D3
4  NaN  B4  C4   D4

默认情况下,某个位置上缺失的数据会用NaN表示,如果不想这样,可以用join和join_axes参数设置合并方式。默认的合并方式是对所有输入列进行并集合并(join=’outter’),当然也可以用join=’inner’实现对输入列的交集合并:

print(pd.concat([df5,df6],join='inner'))

#输出结果:
    B   C
1  B1  C1
2  B2  C2
3  B3  C3
4  B4  C4

另外一种合并方式是直接确定使用的列名,设置join_axes 参数,里面是索引对象构成的列表(是列表的列表)。如下面示例所示,将结果的列名设置为第一个输入的列名:

print(pd.concat([df5,df6], join_axes=[df5.columns]))

#输出结果:
     A   B   C
1   A1  B1  C1
2   A2  B2  C2
3  NaN  B3  C3
4  NaN  B4  C4

猜你喜欢

转载自blog.csdn.net/jasonzhoujx/article/details/81639318
今日推荐