如何将 mongodb 集合中的数据加载到 pandas 的 DataFrame 中?
Posted
技术标签:
【中文标题】如何将 mongodb 集合中的数据加载到 pandas 的 DataFrame 中?【英文标题】:How can I load data from mongodb collection into pandas' DataFrame? 【发布时间】:2013-07-22 05:37:38 【问题描述】:我是 pandas 的新手(嗯,对所有“编程”...),但有人鼓励我尝试一下。 我有一个 mongodb 数据库 - “test” - 带有一个名为“tweets”的集合。 我在 ipython 中访问数据库:
import sys
import pymongo
from pymongo import Connection
connection = Connection()
db = connection.test
tweets = db.tweets
tweet中文档的文档结构如下:
entities': u'hashtags': [],
u'symbols': [],
u'urls': [],
u'user_mentions': [],
u'favorite_count': 0,
u'favorited': False,
u'filter_level': u'medium',
u'geo': u'coordinates': [placeholder coordinate, -placeholder coordinate], u'type': u'Point',
u'id': 349223842700472320L,
u'id_str': u'349223842700472320',
u'in_reply_to_screen_name': None,
u'in_reply_to_status_id': None,
u'in_reply_to_status_id_str': None,
u'in_reply_to_user_id': None,
u'in_reply_to_user_id_str': None,
u'lang': u'en',
u'place': u'attributes': ,
u'bounding_box': u'coordinates': [[[placeholder coordinate, placeholder coordinate],
[-placeholder coordinate, placeholder coordinate],
[-placeholder coordinate, placeholder coordinate],
[-placeholder coordinate, placeholder coordinate]]],
u'type': u'Polygon',
u'country': u'placeholder country',
u'country_code': u'example',
u'full_name': u'name, xx',
u'id': u'user id',
u'name': u'name',
u'place_type': u'city',
u'url': u'http://api.twitter.com/1/geo/id/1820d77fb3f65055.json',
u'retweet_count': 0,
u'retweeted': False,
u'source': u'<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>',
u'text': u'example text',
u'truncated': False,
u'user': u'contributors_enabled': False,
u'created_at': u'Sat Jan 22 13:42:59 +0000 2011',
u'default_profile': False,
u'default_profile_image': False,
u'description': u'example description',
u'favourites_count': 100,
u'follow_request_sent': None,
u'followers_count': 100,
u'following': None,
u'friends_count': 100,
u'geo_enabled': True,
u'id': placeholder_id,
u'id_str': u'placeholder_id',
u'is_translator': False,
u'lang': u'en',
u'listed_count': 0,
u'location': u'example place',
u'name': u'example name',
u'notifications': None,
u'profile_background_color': u'000000',
u'profile_background_image_url': u'http://a0.twimg.com/images/themes/theme19/bg.gif',
u'profile_background_image_url_https': u'https://si0.twimg.com/images/themes/theme19/bg.gif',
u'profile_background_tile': False,
u'profile_banner_url': u'https://pbs.twimg.com/profile_banners/241527685/1363314054',
u'profile_image_url': u'http://a0.twimg.com/profile_images/378800000038841219/8a71d0776da0c48dcc4ef6fee9f78880_normal.jpeg',
u'profile_image_url_https': u'https://si0.twimg.com/profile_images/378800000038841219/8a71d0776da0c48dcc4ef6fee9f78880_normal.jpeg',
u'profile_link_color': u'000000',
u'profile_sidebar_border_color': u'FFFFFF',
u'profile_sidebar_fill_color': u'000000',
u'profile_text_color': u'000000',
u'profile_use_background_image': False,
u'protected': False,
u'screen_name': placeholder screen_name',
u'statuses_count': xxxx,
u'time_zone': u'placeholder time_zone',
u'url': None,
u'utc_offset': -21600,
u'verified': False
现在,据我了解,pandas 的主要数据结构——类似电子表格的表格——被称为 DataFrame。如何将“推文”集合中的数据加载到 pandas 的 DataFrame 中?以及如何查询数据库中的子文档?
【问题讨论】:
应该有办法使用 read_json 来做到这一点,这样会更有效(尤其是对于大型数据集)。 【参考方案1】:在将光标传递给 DataFrame 之前理解从 MongoDB 获得的光标
import pandas as pd
df = pd.DataFrame(list(tweets.find()))
【讨论】:
太好了,通过传递“df”,集合的文档在数据列中出现。但是,我需要在其中一个文档“实体”中查询子文档 - “hashtags.text”。知道如何在 pandas 中做到这一点吗? 您能否为您的文档提供一些示例,以便我为您提供帮助? 你需要什么?标签字段? 是的,我对主题标签字段感兴趣。 我有一个包含 283000 行的集合,每行有 10 列(5 个双精度数、2 个长整数、2 个字符串和 1 个 ISODate)。给我 DataFrame 需要 3-5 秒。我预计这大约需要零秒。我看到list()
花费了大部分时间。这是预期的还是我在某处有一些糟糕的配置? (仅供参考,我正在阅读整个系列,即使用find()
)【参考方案2】:
您可以使用此代码将 MongoDB 数据加载到 pandas DataFame。这个对我有用。也希望你。
import pymongo
import pandas as pd
from pymongo import Connection
connection = Connection()
db = connection.database_name
input_data = db.collection_name
data = pd.DataFrame(list(input_data.find()))
【讨论】:
这里我们提到了集合名称。如果我们不想提及集合名称,那么我们如何归档它。?【参考方案3】:如果你在 MongoDb 中有这样的数据:
[
"name": "Adam",
"age": 27,
"address":
"number": 4,
"street": "Main Road",
"city": "Oxford"
,
"name": "Steve",
"age": 32,
"address":
"number": 78,
"street": "High Street",
"city": "Cambridge"
]
您可以像这样将数据直接放入数据框中:
from pandas import DataFrame
df = DataFrame(list(db.collection_name.find())
你会得到这个输出:
df.head()
| | name | age | address |
|----|---------|------|-----------------------------------------------------------|
| 1 | "Steve" | 27 | "number": 4, "street": "Main Road", "city": "Oxford" |
| 2 | "Adam" | 32 | "number": 78, "street": "High St", "city": "Cambridge" |
但是,子文档将在子文档单元格中显示为 JSON。如果您想展平对象以便子文档属性显示为单个单元格,您可以使用 json_normalize 而不使用任何参数。
from pandas.io.json import json_normalize
datapoints = list(db.collection_name.find()
df = json_normalize(datapoints)
df.head()
这将给出这种格式的数据框:
| | name | age | address.number | address.street | address.city |
|----|--------|------|----------------|----------------|--------------|
| 1 | Thomas | 27 | 4 | "Main Road" | "Oxford" |
| 2 | Mary | 32 | 78 | "High St" | "Cambridge" |
【讨论】:
如果我们不想提及集合名称,那么如何获取所有集合的数据?? 这是否适用于来自 MongoDB 的几 GB 数据?还是 Pandas Dataframe 受到影响,我们需要尝试另一种方法?就像我有一个将近 15 GB 的推文 JSON 数据导入到 MongoDB 中,我正在尝试将其转换为 CSV。 追溯文件“C:\DEV\Python\lib\site-packages\pymongo\network.py”,第 235 行,_receive_data_on_socket buf = bytearray(length) MemoryError ``` result_df = pd.json_normalize( # data=json.loads(raw_json_line_text)) data=pymongo_collection.find() # data=tuple(pymongo_collection.find()) )``` 有效不用转换就好了|读取 pymongo 光标到列表或元组。【参考方案4】:使用: df=pd.DataFrame.from_dict(collection)
【讨论】:
缺少上下文。例如,如果我在没有任何上下文的情况下按照您所说的进行尝试,我会收到以下错误:“TypeError: 'Collection' object is not iterable”。以上是关于如何将 mongodb 集合中的数据加载到 pandas 的 DataFrame 中?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用graphql将mongodb中多个集合中的数据传递到1个反应表
mongodb 如何把从一个集合中的查询结果 插入到一个新的集合