python数据处理/包含字典的数组
从mongo提取数据的时候,遇到了一类让人有点头疼的数据,数据类型是一个数组,数组内包含的是字典,大致如下:
在处理的过程中想了半天办法,也学了不少东西:先说说怎么处理这类数据,再来说我中间用到的几种新的方法,虽然没有起到特别大的作用,但是学到了不少新东西。
解决办法算是用了比较暴力的方法:
使用mongo的aggregate方法筛选数据,这里的col是我已经创建好了的一个指定mongo的表
pipline = [ {'$match': {"$and": [{"crawl_time": {"$gte": "2020-07-23 0:0:0"}}, {"crawl_time": {"$lt": "2020-08-03 0:0:0"}}] }}, {'$project': {'songId': 1, 'playCount': 1, 'crawl_time': 1, 'songName': 1, 'albums': 1,'artists':1}}] mongo_r = col.aggregate(pipline) songId = [] playCount = [] crawl_time = [] songName = [] albums_name = [] albums_id = [] artists_name=[] for i in mongo_r: try: songId.append(i['songId']) except: songId.append(0) try: playCount.append(i['playCount']) except: playCount.append(0) try: crawl_time.append(i['crawl_time']) except: crawl_time.append(0) try: songName.append(i['songName']) except: songName.append(0) try: albums_name.append(i['albums'][0]['name']) except: albums_name.append(0) try: albums_id.append(i['albums'][0]['id']) except: albums_id.append(0) try: artists_name.append(i['artists'][0]['name']) except: artists_name.append(0) mongo_r = {'songId': songId, 'playCount': playCount, 'crawl_time': crawl_time, 'songName': songName, 'albums_name': albums_name, 'albums_id': albums_id,'artists_name':artists_name} #生成一个字典类型的数字组,最后在将数据组使用pd接收一下 mongo_r = pd.DataFrame(mongo_r)
中间还发现了mongo的一些有意思的语法:
pipline = [ {'$match': {"$and": [{"crawl_time": {"$gte": "2020-07-23 0:0:0"}}, {"crawl_time": {"$lt": "2020-08-03 0:0:0"}}] }}, {'$project': {'songId': 1, 'playCount': 1, 'crawl_time': 1, 'songName': 1, 'albums_id: '$albums.id','artists_id':'$artists.id'}}]
这里的$artist.id表示的是选取在artist这个数字里面的字典id对应的value,不过取出来的数据类型是一个数组,这一点要注意,因为可能在你使用pandas处理的时候有的方法不能使用
另外pandas读取字典类型数据的方法,可以使用
df=pd.DataFrame.from_dict()
下面是他的文档,瞅一眼就可以明白是什么意思了,还是比较明了的,另外这个函数他有一个参数是orient,可以选填为index(可选),column(默认),作用分别是使用索引还是使用字段名作为pd的索引,这个最好是亲手试一下,印象更深刻