基于数据框中的列合并两个excel文件VLookup样式

时间:2017-09-25 13:28:41

标签: python sql pandas

我的目标是在查询完整的用户名/电子邮件信息后合并包含用户名/ ipaddress或email / ipaddress组合的csv文件中的列。这似乎是一个基本的内部联接但不起作用

example row in original file:
username     email                  ip address
NaN           user@user.com           69.0.1.127
Wilco         NaN                     69.0.12.128

从查询输出到需要组合的csv文件的示例行:

username     email              branch

roger1       user@user.com      Los Angelas
Wilco        user2@user.com     Montreal

预期产出:

username       email              branch           ipaddress
roger1         user@user.com      Los Angelas      69.0.1.127
Wilco          user2@user.com     Montreal         69.0.12.128

该程序的第一部分是从具有用户名或电子邮件的ip address excel表中收集数据 填写,但不是两个...所有这一切是在这张表和最后结合用户名电子邮件和ipaddress 表格已创建。

directory variable = dirname

all_data = pd.DataFrame()

emailList=[]
userList = []
print "Dirname is " + dirname
#loop over excel sheets and create email and user strings to use for query
for f in glob.glob(dirname+"/Book1.xlsx"):
    df=pd.read_excel(f)
    all_data = all_data.append(df,ignore_index=True)

    all_data = all_data.append(df,ignore_index=True)
    emailList = all_data.dropna(subset=["email"])
    userList = all_data.dropna(subset=["user"])

    userList = userList["user"].tolist()
    emailList = emailList["email"].tolist()
    userList = map(int,userList)
    userList = ','.join(map(str,userList))
    emailList = "', '".join(map(str, emailList))

    emailList = "'" + emailList.upper() + "'"

all_data['email'] = all_data['email'].str.upper()

在此处查询构建逻辑<>

将电子邮件转换为上层和其他语法,以便进行下一步的SQL查询

con=cx_Oracle.connect("*************")
print "connection successful"
df_ora = pd.read_sql(queryStringEmail,con)
df_ora2 = pd.read_sql(queryStringUserList, con)
frames = [df_ora,df_ora2]
con.close()
newtable = pd.concat(frames)

这为我提供了程序中第一个excel表所需的用户列表。所有其他行都可以忽略 除了此数据框中的用户名/电子邮件输出。

nt = newtable.drop_duplicates(keep='last')

nt.to_csv("newcsv.csv", index=False, encoding='utf-8')
print "Operation successful"

从第二个csv文件中删除重复项,因为多个相同的用户名/电子邮件/分支组合无用

这里有很多意大利面条代码,我道歉,但这就是逻辑模糊的地方

for f in glob.glob(dirname+"/newcsv.csv"):
    aa=pd.read_csv(f)
all_data.to_csv("newcsvALLDATA.csv", index=False, encoding='utf-8')
aa.to_csv("newcsvALLDATA2.csv", index=False, encoding='utf-8')

重命名新csv文件中的列以匹配原始IP地址csv中的列(实际上只是电子邮件和用户)

aa.columns = ['user','email','first name','last name', 'branch', 'location']
print all_data
print aa

这是我尝试过所有组合并失败的地方:

all_data = 

all_data.merge(aa,left_index=True,right_index=True,left_on="IP",how='inner')

print all_data
all_data.to_csv("newcsv2.csv", index=False, encoding='utf-8')
aa.to_excel(writer, sheet_name = 'x2')

我目前无法打印数据,因为我无法访问数据库,但如果有人有任何想法,可以在以后显示

再次目标是输出一个csv文件,其中包含与ipaddress csv匹配的用户名/电子邮件组合,其中包含一封电子邮件 列出的用户名或用户名

1 个答案:

答案 0 :(得分:1)

以后任何人都会遇到这个问题,我用以下代码解决了这个问题

aa.columns = ['user','email','first name','last name', 'provID', 'provName']
print aa
all_dataMerge = pd.merge(aa,all_data, on='user', suffixes=['1','2'])

合并发生在1个键上的两个表之间,但它在逻辑上处理。简单的回答让我永远想通了。希望这可以帮助将来的某个人。

   #Logic to combine the dataframes into final form, similar to VLookup
    data_final = all_dataMerge.drop_duplicates(keep='first')
相关问题