萝卜头社区 http://www.luobotou.net 需要用python 实现excel的vlookup
1直接用excel vlookup,每次都设,不方便,我们该用python 看下。
PYTHON对于两个表的连接有两个重要拼接函数,pandas 中的 concat 和merge
定义两个表:
``````
import pandas as pd
import numpy as np
df1=pd.DataFrame([[1,1.5,0],[2,2.2,1],[3,np.nan,np.nan]],columns=['id','num','sex'])
df2=pd.DataFrame([[1,1.5],[2,2.2],[3,3.8],[4,4.4]],columns=['id','num'])
print(df1,df2)
```
```
结果:表DF1
id num sex
0 1 1.5 0.0
1 2 2.2 1.0
2 3 NaN NaN
结果:表DF2
id num
0 1 1.5
1 2 2.2
2 3 3.8
3 4 4.4
1、Python-concat
都是ID为主键,num为数值
由此可见concat其实就是个拼接函数,无脑拼接
#axis =0或缺省 为上下连接,axis =1则左右连接
程序代码如下:#concat的傻瓜式样的连接
print(df1,df2)
df3=pd.concat([df1,df2])
print("=====df3=concat=======")
print(df3)
df4=pd.concat([df1,df2],axis=1)#axis =0或缺省 为上下连接,=1则左右连接
print("=====df4=concat==axis=1=====")
print(df4)
结果:表DF3
=====df3=concat=======
id num sex
0 1 1.5 0.0
1 2 2.2 1.0
2 3 NaN NaN
0 1 1.5 NaN
1 2 2.2 NaN
2 3 3.8 NaN
3 4 4.4 NaN
结果:表DF4
=====df4=concat==axis=1=====
id num sex id num
0 1.0 1.5 0.0 1 1.5
1 2.0 2.2 1.0 2 2.2
2 3.0 NaN NaN 3 3.8
3 NaN NaN NaN 4 4.4
2.Python-merge
语法:dataframe.merge(dataframe1, dataframe2, how, on, copy, indicator, suffixes, validate)
merge其实就是数据库里面的join函数。
相较于concat,id只有一列了但这个是典型的左连接,他只适应于相同索引,不同列的拼接
参数:
datafram1:要合并的dataframe对象。pd1
dataframe2:要合并的dataframe对象。pd2
简单完全合并,样式如下
result=pd.merge(pd1,pd2,on='学号',how="inner")
只将表2中的某一列拿出来合并,则将这一列 索引列出来,并且关键索引页必须列出来:如下,分数拿出来,学号是关键字索引!
result=pd.merge(pd1,pd2.loc[:,['学号','分数']],on='学号',how="inner")
how:{left,right,inner,external}指定如何进行合并
内联接(Inner join):内部联接仅产生两行都满足条件的那些行的输出数据帧。要执行内部联接,您可以指定inner作为关键字。
左联接(Left join):左联接操作提供第一个数据帧中的所有行以及第二个数据帧中匹配的行。如果第二个数据帧中的行不匹配,则将其替换为NaN
右连接(Right join):右连接有点类似于左连接,在右连接中,输出数据帧将包含第二个数据帧中的所有行和第一个数据帧中的匹配行。如果第一个数据帧中的行不匹配,则将其替换为NaN
外联接(Outer join):外部联接提供了由两个数据帧中的行组成的输出数据帧。如果行匹配,将显示值,否则将显示不匹配的NaN。例:
on:指定用于执行连接的列或索引名称。
suffixes:后缀用于重叠的列。对于异常,使用值(False,False)。
validate:如果指定,则检查合并的类型.merge的类型可以是(one-one,one-many,many-one,many-many)。
========代码#merge连接 join的函数方式
df5=pd.merge(df1,df2,on="id",how='left')#以左侧数据为核心
#on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。
print("=====df5=merge===left==")
print(df5)
df5=pd.merge(df1,df2,on="id",how='right')#以右侧数据为核心
print("=====df5=merge===right==")
print(df5)
df5=pd.merge(df1,df2,on="id",how='inner')#以右侧数据为核心
print("=====df5=merge===inner==")
print(df5)
df5=pd.merge(df1,df2,on="id",how='outer')#以右侧数据为核心
print("=====df5=merge===outer==")
print(df5)
结果:表DF5
=====df5=merge===left==
id num_x sex num_y
0 1 1.5 0.0 1.5
1 2 2.2 1.0 2.2
2 3 NaN NaN 3.8
=====df5=merge===right==
id num_x sex num_y
0 1 1.5 0.0 1.5
1 2 2.2 1.0 2.2
2 3 NaN NaN 3.8
3 4 NaN NaN 4.4
=====df5=merge===inner==
id num_x sex num_y
0 1 1.5 0.0 1.5
1 2 2.2 1.0 2.2
2 3 NaN NaN 3.8
=====df5=merge===outer==
id num_x sex num_y
0 1 1.5 0.0 1.5
1 2 2.2 1.0 2.2
2 3 NaN NaN 3.8
3 4 NaN NaN 4.4
3、.Python-fillna----填充空值
通过merge方式,可以实现vlookup,但能否将DF1中的空值,用DF2对应的数据填充呢?
这个就要用到 fillna 函数!用空值填充?完美解决问题!
代码:#fillna 填充空值的方式
df1=df1.set_index('id')
df2=df2.set_index('id')
df6=df1.fillna(df2) #用DF2的值填充DF1的空值
print("=====df6用DF2的值填充DF1的空值=fillna=====")
print(df6)
=====df6用DF2的值填充DF1的空值=fillna=====
num sex id
1 1.5 0.0
2 2.2 1.0
3 3.8 NaN