# 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()
#练习
#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])
#读取文件
#第一个参数:读取的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=['发货地区','手机型号'])