pandas(四)pandas的拼接操作

本文详细介绍了pandas的拼接操作,包括pd.concat的简单级联、不匹配级联和使用append()添加数据。还探讨了pandas的合并操作,如一对一、多对一、多对多合并,以及内合并、外合并、列冲突的解决。通过案例分析美国各州人口数据,展示了在实际问题中如何进行数据合并和处理缺失值。
摘要由CSDN通过智能技术生成

pandas的拼接操作

pandas的拼接分为两种:

  • 级联:pd.concat, pd.append
  • 合并:pd.merge, pd.join

0. 回顾numpy的级联

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]:
array([ 1,  2,  3, -1, -2, -3, -4])
In [4]:
nd3 = np.array([[1,2,3],[4,5,6]])
nd3
Out[4]:
array([[1, 2, 3],
       [4, 5, 6]])
In [5]:
np.concatenate([nd1,nd3],axis=1) # 维度不同无法级联
---------------------------------------------------------------------------
AxisError                                 Traceback (most recent call last)
<ipython-input-5-8f0014705afb> in <module>()
----> 1 np.concatenate([nd1,nd3],axis=1) # 维度不同无法级联

AxisError: axis 1 is out of bounds for array of dimension 1

In [6]:
nd4 = np.random.randint(0,10,size=(3,3))
nd4
Out[6]:
array([[4, 6, 1],
       [9, 3, 7],
       [9, 6, 3]])
In [7]:
np.concatenate([nd3,nd4],axis=0)
Out[7]:
array([[1, 2, 3],
       [4, 5, 6],
       [4, 6, 1],
       [9, 3, 7],
       [9, 6, 3]])
In [8]:
nd3 + nd4
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-abc835f3e1d9> in <module>()
----> 1 nd3 + nd4

ValueError: operands could not be broadcast together with shapes (2,3) (3,3) 

In [9]:
nd1 + nd3 # 维度不一样可以广播机制
Out[9]:
array([[2, 4, 6],
       [5, 7, 9]])

============================================

练习12:

  1. 生成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]:
  a b c
1 a1 b1 c1
2 a2 b2 c2
4 a4 b4 c4
In [13]:
df2 = make_df(list("abc"),[4,5,6])
df2
Out[13]:
  a b c
4 a4 b4 c4
5 a5 b5 c5
6 a6 b6 c6

1. 使用pd.concat()级联

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)

1) 简单级联

和np.concatenate一样,优先增加行数(默认axis=0)

In [14]:
pd.concat([df1,df2])
Out[14]:
  a b c
1 a1 b1 c1
2 a2 b2 c2
4 a4 b4 c4
4 a4 b4 c4
5 a5 b5 c5
6 a6 b6 c6
In [15]:
pd.concat([df1,df2],axis=1)
Out[15]:
  a b c a b c
1 a1 b1 c1 NaN NaN NaN
2 a2 b2 c2 NaN NaN NaN
4 a4 b4 c4 a4 b4 c4
5 NaN NaN NaN a5 b5 c5
6 NaN NaN NaN a6 b6 c6

可以通过设置axis来改变级联方向

In [ ]:

注意index在级联时可以重复

也可以选择忽略ignore_index,重新索引

In [16]:
pd.concat([df1,df2],axis=0,ignore_index=True)
Out[16]:
  a b c
0 a1 b1 c1
1 a2 b2 c2
2 a4 b4 c4
3 a4 b4 c4
4 a5 b5 c5
5 a6 b6 c6

或者使用多层索引 keys

concat([x,y],keys=['x','y'])

In [17]:
pd.concat([df1,df2],keys=["教学","品保"])
Out[17]:
    a b c
教学 1 a1 b1 c1
2 a2 b2 c2
4 a4 b4 c4
品保 4 a4 b4 c4
5 a5 b5 c5
6 a6 b6 c6

============================================

练习13:

  1. 想一想级联的应用场景?

  2. 使用昨天的知识,建立一个期中考试张三、李四的成绩表ddd

  3. 假设新增考试学科"计算机",如何实现?

  4. 新增王老五同学的成绩,如何实现?

============================================

In [ ]:

2) 不匹配级联

不匹配指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不一致

In [18]:
df1
Out[18]:
  a b c
1 a1 b1 c1
2 a2 b2 c2
4 a4 b4 c4
In [19]:
df3 = make_df(list("abcd"),[1,2,3,4])
df3
Out[19]:
  a b c d
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
In [20]:
pd.concat([df1,df3],axis=0)
Out[20]:
  a b c d
1 a1 b1 c1 NaN
2 a2 b2 c2 NaN
4 a4 b4 c4 NaN
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
In [21]:
pd.concat([df1,df3],axis=1)
Out[21]:
  a b c a b c d
1 a1 b1 c1 a1 b1 c1 d1
2 a2 b2 c2 a2 b2 c2 d2
3 NaN NaN NaN a3 b3 c3 d3
4 a4 b4 c4 a4 b4 c4 d4

有3种连接方式:

  • 外连接:补NaN(默认模式)
In [22]:
pd.concat([df1,df3],axis=0,join="outer")
# 1、不匹配级联在外连接的模式下要求如果axis=0行级联列索引必须保持一致,
#axis=1列级联行索引必须保持一致
# 2、如果不一致缺哪个索引就补全哪个索引
Out[22]:
  a b c d
1 a1 b1 c1 NaN
2 a2 b2 c2 NaN
4 a4 b4 c4 NaN
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
  • 内连接:只连接匹配的项
In [23]:
pd.concat([df1,df3],axis=0,join="inner")
# 内连接在级联的时候不一致的地方全部丢弃
Out[23]:
  a b c
1 a1 b1 c1
2 a2 b2 c2
4 a4 b4 c4
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
4 a4 b4 c4
In [24]:
df4 = make_df(list("aecd"),[1,2,3,4])
df4
Out[24]:
  a c d e
1 a1 c1 d1 e1
2 a2 c2 d2 e2
3 a3 c3 d3 e3
4 a4 c4 d4 e4
In [25]:
pd.concat([df3,df4],axis=0,join="inner")
Out[25]:
  a c d
1 a1 c1 d1
2 a2 c2 d2
3 a3 c3 d3
4 a4 c4 d4
1 a1 c1 d1
2 a2 c2 d2
3 a3 c3 d3
4 a4 c4 d4
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值