005萝卜头学python:用PYTHON实现EXCEL的vlo

2020-04-05  本文已影响0人  萝卜头科技

萝卜头社区 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

上一篇下一篇

猜你喜欢

热点阅读