pandas表字段为空用其余表替换

需求:要求将两张表合并,第一张表字段为空时用第二张表字段代替

import pandas as pd
import numpy as np
##修改列的名字
def Null_Next_Fill(df1,df2,merge_list):
    #当需要匹配的参数为两个时,将需要匹配的参数提前,防止在之后的操作中重命名
    for i,j in enumerate(merge_list):
        df1_new = df1[j]
        df1 = df1.drop(j,axis=1)
        df1.insert(i,j,df1_new)
        df2_new = df2[j]
        df2 = df2.drop(j,axis=1)
        df2.insert(i,j,df2_new)
    #寻找df1与df2中的共有的列名
    same_col=[i for i in df1.columns if i in df2.columns]
    #给df2中相同变量赋予新名称
    same_col_new=same_col.copy()
    for i in range(len(merge_list),len(same_col)):
        same_col_new[i]=same_col_new[i]+'_new'
    #修改列名
    for i,j in zip(same_col,same_col_new):
        df2 = df2.rename(columns={i:j})
    #将df1和df2以关键字匹配
    rel_df = pd.merge(df1,df2,on=merge_list,how='outer')
    #讲df中空缺的值用df2中的值填补
    for i,j in zip(same_col[len(merge_list):],same_col_new[len(merge_list):]):
        rel_df.loc[rel_df[i].isnull(),i]=rel_df[j]
    #删除过程中出现的变量(优化)
    drop_col=[i for i in same_col_new if i not in merge_list]
    rel_df=rel_df.drop(drop_col,axis=1)
    return rel_df
Test1=pd.DataFrame()
Test1['Id']=[1,2,3,4]
Test1['Data']=[1,2,3,4]
Test1['Sex']=[1,2,np.nan,2]
Test1['Age']=[14,16,18,40]
Test1['location']=[np.nan,np.nan,21,53]
Test1.head()
IdDataSexAgelocation
0111.014NaN
1222.016NaN
233NaN1821.0
3442.04053.0
Test2=pd.DataFrame()
Test2['Id']=[1,2,3,5]
Test2['Data']=[1,3,3,4]
Test2['Sex']=[1,2,1,2]
Test2['Age']=[14,16,28,40]
Test2['name']=[321,321,321,321]
Test2.head()
IdDataSexAgename
011114321
123216321
233128321
354240321
Test3=pd.DataFrame()
Test3['Id']=[4]
Test3['Data']=[4]
Test3['name']=[32]
Test3.head()
IdDataname
04432
ons_list=['Id','Data']
df3=Null_Next_Fill(Test1,Test2,ons_list)
df3
IdDataSexAgelocationname
0111.014.0NaN321.0
1222.016.0NaNNaN
2331.018.021.0321.0
3442.040.053.0NaN
4232.016.0NaN321.0
5542.040.0NaN321.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值