利用Pandas实现Mongodb的多表连接查询并将DataFr
2019-03-14 本文已影响130人
越大大雨天
- 接上一篇文章,利用pandas完成了对mongodb数据库中的小区名字聚合查询以及批量经纬度的爬取,并将获取的信息写入了一个新的Mongodb表中。
- 新目标:需要把数据库中原始表格(包含10w+房源信息)和新表(包含7k+小区经纬度信息)进行合并。使两表以小区名为连接键,在原始表信息后准确添加对应的经纬度信息。
import pymongo
import pandas as pd
import matplotlib as plt
#连接到数据库
client = pymongo.MongoClient("localhost",27017)
lianjia = client["ershoufang"]
info = lianjia["lianjia_info"]
location = lianjia['location_info']
#将数据表1(包含原始10w+房源信息)转化为DataFrame
data1 = pd.DataFrame(list(info.find()))
print(data1.head())
#将数据表2(包含7k+小区经纬度信息)转化为DataFrame
data2 = pd.DataFrame(list(location.find()))
print(data2.head())
#多表查询,以house_name为共同键,向表一合并,与mysql的查询功能类似,得到合并后的DataFrame
result =pd.merge(data1,data2,on="house_name",how="left")
print(result.head())
- 好啦!所需的DataFrame格式的数据就成功且简单的得到了!
可是,该怎么存进MongoDB呢,Mongo需要接受字典格式的数据才能传入啊~
。。。。。
作为边写简书边做的我真的折腾了好久也没找到很好又简单的方法,最后我用的完整代码如下
import pymongo
import pandas as pd
#连接到数据库
#连接到数据库
client = pymongo.MongoClient("localhost",27017)
lianjia = client["ershoufang"]
info = lianjia["lianjia_info"]
location = lianjia['location_info']
#将数据表1(包含原始10w+房源信息)转化为DataFrame
data1 = pd.DataFrame(list(info.find()))
print(data1.head())
#将数据表2(包含7k+小区经纬度信息)转化为DataFrame
data2 = pd.DataFrame(list(location.find()))
print(data2.head())
#多表查询,以house_name为共同键,向表一合并,与mysql的查询功能类似,得到合并后的DataFrame
result =pd.merge(data1,data2,on="house_name",how="left").drop(['_id_x','_id_y'],axis="columns")
#衔接上面代码,用于插入数据库,遍历插入的,不知道有没有简单的办法啊~
for i in range(len(result)):
s = result.loc[i]
#这里加了str()函数是无奈之举,DataFrame中的专有float64等数字格式使MongoDB无法识别,写入会报错,暂时先全部转换为字符串格式写入吧
dic = {index:str(s[index]) for index in s.index}
new_info.insert_one(dic)
print(dic)
- 然后总算勉强完成了,这对数据量不大就10w条数据来说效率还是挺高的,但总觉得这不是最佳办法,如果正好有懂的能看到这篇文章,欢迎提出,感激不尽啊~~