pandas的拼接分为两种:
- 级联:pd.concat, pd.append
- 合并:pd.merge, pd.join
In [1]:
import numpy as np
In [2]:
nd1 = np.array([1,2,3])
nd2 = np.array([-1,-2,-3,-4])
In [3]:
np.concatenate([nd1,nd2],axis=0)
Out[3]:
In [4]:
nd3 = np.array([[1,2,3],[4,5,6]])
nd3
Out[4]:
In [5]:
np.concatenate([nd1,nd3],axis=1) # 维度不同无法级联
In [6]:
nd4 = np.random.randint(0,10,size=(3,3))
nd4
Out[6]:
In [7]:
np.concatenate([nd3,nd4],axis=0)
Out[7]:
In [8]:
nd3 + nd4
In [9]:
nd1 + nd3 # 维度不一样可以广播机制
Out[9]:
============================================
练习12:
- 生成2个3*3的矩阵,对其分别进行两个维度上的级联
============================================
In [ ]:
为方便讲解,我们首先定义一个生成DataFrame的函数:
In [10]:
import pandas as pd
from pandas import DataFrame,Series
In [11]:
# 定义一个函数,根据行he列名对元素设置值
def make_df(cols,inds):
data = { c:[c+str(i) for i in inds] for c in cols}
return DataFrame(data,index=inds)
In [12]:
df1 = make_df(list("abc"),[1,2,4])
df1
Out[12]:
In [13]:
df2 = make_df(list("abc"),[4,5,6])
df2
Out[13]:
pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
和np.concatenate一样,优先增加行数(默认axis=0)
In [14]:
pd.concat([df1,df2])
Out[14]:
In [15]:
pd.concat([df1,df2],axis=1)
Out[15]:
可以通过设置axis来改变级联方向
In [ ]:
注意index在级联时可以重复
也可以选择忽略ignore_index,重新索引
In [16]:
pd.concat([df1,df2],axis=0,ignore_index=True)
Out[16]:
或者使用多层索引 keys
concat([x,y],keys=['x','y'])
In [17]:
pd.concat([df1,df2],keys=["教学","品保"])
Out[17]:
============================================
练习13:
想一想级联的应用场景?
使用昨天的知识,建立一个期中考试张三、李四的成绩表ddd
假设新增考试学科"计算机",如何实现?
新增王老五同学的成绩,如何实现?
============================================
In [ ]:
不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致
In [18]:
df1
Out[18]:
In [19]:
df3 = make_df(list("abcd"),[1,2,3,4])
df3
Out[19]:
In [20]:
pd.concat([df1,df3],axis=0)
Out[20]:
In [21]:
pd.concat([df1,df3],axis=1)
Out[21]:
有3种连接方式:
- 外连接:补NaN(默认模式)
In [22]:
pd.concat([df1,df3],axis=0,join="outer")
# 1、不匹配级联在外连接的模式下要求如果axis=0行级联列索引必须保持一致,
#axis=1列级联行索引必须保持一致
# 2、如果不一致缺哪个索引就补全哪个索引
Out[22]:
- 内连接:只连接匹配的项
In [23]:
pd.concat([df1,df3],axis=0,join="inner")
# 内连接在级联的时候不一致的地方全部丢弃
Out[23]:
In [24]:
df4 = make_df(list("aecd"),[1,2,3,4])
df4
Out[24]:
In [25]:
pd.concat([df3,df4],axis=0,join="inner")
Out[25]: