# pandas的拼接操作分为两种:
# 级联: pd.concat
# pd.append
# 合并: pd.merge
#1,建立一个期中考试张三,李四的成绩表df
#2,假如新增考试科目'计算机',如何实现
# 级联: 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=['发货地区','手机型号'])