pandas的拼接操作

# pandas的拼接操作分为两种:
#    级联: pd.concat
#          pd.append
#    合并: pd.merge

#          pd.join

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
%matplotlib inline
#练习:生成2个5*5的矩阵,对其分别进行两个维度上的级联
n1 = np.random.randint(0,100,size=(5,5))
n2 = np.random.randint(0,100,size=(5,5))
n3 = np.concatenate((n1,n2),axis=0)
n3
n4 = np.concatenate((n1,n2),axis=1)
n4
def create_df(index,columns):
    data = {k:[k+str(i) for i in index] for k in columns}
    return DataFrame(data=data,index=index)
df1 = create_df(list('12345'),list('ABCDE'))
df1
df2 = create_df(list('12345'),list('EFGHI'))
df2
pd.concat((df1,df2),axis=1)

#使用pd.concat()函数级联与np.concatenate函数类似 

#axis, ignore_index
#一般用于横向级联,就是以行标签为参考进行的级联,ignore_index会重新分配标签
pd.concat((df1,df2),axis=0,ignore_index=True)
#使用多层索引 keys
#concat([x,y],keys=['x','y'])
pd.concat((df1,df2),axis=1,keys=['期中','期末'])
df3 = create_df(list('123'),list('xyz'))
df3

total = pd.concat((df1,df3),axis=1)
total
#查看一张表中哪一列存在空值
nan_list = total.isnull().any(axis=0)
nan_list
total.loc[:,nan_list]

#需求:提取包含空值的列

n = np.array([True,False,True])
n.any()

#练习
#1,建立一个期中考试张三,李四的成绩表df
#2,假如新增考试科目'计算机',如何实现

#3,新增王五同学的成绩,如何实现

data = np.random.randint(0,150,size=(2,3))
index = ['张三','李四']
columns = ['python','java','c']
df = DataFrame(data=data,index=index,columns=columns)
df
data1 = np.random.randint(0,150,size=(2,1))
index1 = ['张三','李四']
columns1 = ['计算机']
df1 = DataFrame(data=data1,index=index1,columns=columns1)
df1
score = pd.concat((df,df1),axis=1)
score

data2 = np.random.randint(0,150,size=(1,4))
index2 = ['王五']
columns2 = score.columns
df2 = DataFrame(data=data2,index=index2,columns=columns2)
df2

score.append(df2)
pd.concat((score,df2),axis=0)

不匹配级联


#不匹配指的是级联的维度的索引不一致
#比如:纵向级联时,列索引不一致
#再比如:横向级联时,行索引不一致

#有3种连接方式:
#  外连接:补NaN
#  内连接:只连接匹配的项
#  连接指定轴join_axes
df1 = create_df(list('12345'),list('ABCDE'))
df2 = create_df(list('234'),list('CDE'))
pd.concat((df1,df2),axis=1,join='inner')
pd.concat((df1,df2),axis=0,join_axes=[df2.columns])
index = pd.Index(['C','D'])
pd.concat((df1,df2), axis=0, join_axes=[index])

使用pd.merge()合并

#读取文件
#第一个参数:读取的excel文件的路径
#第二个参数:sheet_name=0/1/2/3
table1 = pd.read_excel('关系表.xlsx',sheet_name=1)
table2 = pd.read_excel('关系表.xlsx',sheet_name=2)
table3 = pd.read_excel('关系表.xlsx',sheet_name=3)
table4 = pd.read_excel('关系表.xlsx',sheet_name=4)
#display(table1,table2...)
display(table1,table2,table3,table4)
#merge与concat的区别在于,merge需要依据某一共同列来进行合并
#使用pd.merge()合并时,会自动根据两者相同的columns名称的那一列,
#作为key来进行合并
#每一列元素的顺序不要求一致
pd.merge(table1,table2,how='outer')

pd.merge(table1,table3,how='outer')

pd.merge(table3,table4,how='outer')

#key的规范化
#使用on=显式指定哪一列为key,当有多个key相同时使用
pd.merge(table3,table4,on='手机型号')

#使用left_on和right_on指定左右两边的列作为key,当左右两边的key都相等时使用

table1.columns = ['型号','参考价格']
table1

table = pd.merge(table1,table2,left_on='型号',right_on='手机型号',how='outer')
table
#删除一行或一列 drop()
#参数1:要删除的行,列标签名
#参数2:axis指定删除的方向,必须与标签名方向匹配

table.drop('手机型号',axis=1)

内合并与外合并


#内合并:只保留两者都有的key
#外合并:how='outer',补NaN
#左合并,右合并:how='left', how='right'
pd.merge(table1,table2,left_on='型号',right_on='手机型号',how='right')
#当列冲突时,即有多个列名相同时,需要使用on=来指定哪一列作为key,
#配合suffixes指定冲突列名

pd.merge(table3,table4,on='手机型号',suffixes=['_上半年','_下半年'])

#如果有更多相同的列,我们可以根据其中某几列来合并

pd.merge(table3,table4,on=['发货地区','手机型号'])



























猜你喜欢

转载自blog.csdn.net/qq_42034590/article/details/80724579