将特定数据从 mongo 导入到 pandas 数据框
Import specific data from mongo to pandas dataframe
我在 mongodb 的集合中有大量数据,我需要使用 pandas 和 jupyter 中的 pymongo 进行分析。我正在尝试在数据框中导入特定数据。
示例数据。
{
"stored": "2022-04-xx",
...
...
"completedQueues": [
"STATEMENT_FORWARDING_QUEUE",
"STATEMENT_PERSON_QUEUE",
"STATEMENT_QUERYBUILDERCACHE_QUEUE"
],
"activities": [
"https://example.com
],
"hash": "xxx",
"agents": [
"mailto:example@example.com"
],
"statement": { <=== I want to import the data from "statement"
"authority": {
"objectType": "Agent",
"name": "xxx",
"mbox": "mailto:example@example.com"
},
"stored": "2022-04-xxx",
"context": {
"platform": "Unknown",
"extensions": {
"http://example.com",
"xxx.com": {
"user_agent": "xxx"
},
"http://example.com": ""
}
},
"actor": {
"objectType": "xxx",
"name": "xxx",
"mbox": "mailto:example@example.com"
},
"timestamp": "2022-04-xxx",
"version": "1.0.0",
"id": "xxx",
"verb": {
"id": "http://example.com",
"display": {
"en-US": "viewed"
}
},
"object": {
"objectType": "xxx",
"id": "https://example.com",
"definition": {
"type": "http://example.com",
"name": {
"en-US": ""
},
"description": {
"en-US": "Viewed"
}
}
}
}, <=== up to here
"hasGeneratedId": true,
...
...
}
请注意,我只对嵌套在“语句”下的数据感兴趣,而不对包含字符串的任何数据感兴趣,即它上面的“STATEMENT_FORWARDING_QUEUE”。
我想要完成的是从数据框中的“语句”(如上所示)导入数据,并以如下方式排列它们:
id
authority objectType
authority name
authority mbox
stored
context platform
context extensions
actor objectType
actor name
...
00
Agent
xxx
mailto
2022-
Unknown
http://1
xxx
xxx
...
01
Agent
yyy
mailto
2022-
Unknown
http://2
yyy
yyy
...
我们的想法是能够访问任何数据,例如“权限名称”或“参与者对象类型”。
我试过:
df = pd.DataFrame(list(collection.find(query)(filters)))
df = json_normalize(list(collection.find(query)(filters)))
使用各种查询、过滤器和切片,以及聚合和 map/reduce,但没有产生正确的输出。
我还想根据“存储”字段(sort('$natural',-1) ?)进行排序(从最新到最旧),并且也可能将 limit(xx) 应用于数据框。
有什么想法吗?
提前致谢。
试试这个
df = json_normalize(list(
collection.aggregate([
{
"$match": query
},
{
"$replaceRoot": {
"newRoot": "$statement"
}
}
])
)
感谢@pavel 的回答。它是正确的,几乎可以解决问题。
我还添加了排序和限制,所以如果有人感兴趣,最后的代码是这样的:
df = json_normalize(list(
statements_coll.aggregate([
{
"$match": query
},
{
"$replaceRoot": {
"newRoot": "$statement"
}
},
{
"$sort": {
"stored": -1
}
},
{
"$limit": 10
}
])
))
我在 mongodb 的集合中有大量数据,我需要使用 pandas 和 jupyter 中的 pymongo 进行分析。我正在尝试在数据框中导入特定数据。
示例数据。
{
"stored": "2022-04-xx",
...
...
"completedQueues": [
"STATEMENT_FORWARDING_QUEUE",
"STATEMENT_PERSON_QUEUE",
"STATEMENT_QUERYBUILDERCACHE_QUEUE"
],
"activities": [
"https://example.com
],
"hash": "xxx",
"agents": [
"mailto:example@example.com"
],
"statement": { <=== I want to import the data from "statement"
"authority": {
"objectType": "Agent",
"name": "xxx",
"mbox": "mailto:example@example.com"
},
"stored": "2022-04-xxx",
"context": {
"platform": "Unknown",
"extensions": {
"http://example.com",
"xxx.com": {
"user_agent": "xxx"
},
"http://example.com": ""
}
},
"actor": {
"objectType": "xxx",
"name": "xxx",
"mbox": "mailto:example@example.com"
},
"timestamp": "2022-04-xxx",
"version": "1.0.0",
"id": "xxx",
"verb": {
"id": "http://example.com",
"display": {
"en-US": "viewed"
}
},
"object": {
"objectType": "xxx",
"id": "https://example.com",
"definition": {
"type": "http://example.com",
"name": {
"en-US": ""
},
"description": {
"en-US": "Viewed"
}
}
}
}, <=== up to here
"hasGeneratedId": true,
...
...
}
请注意,我只对嵌套在“语句”下的数据感兴趣,而不对包含字符串的任何数据感兴趣,即它上面的“STATEMENT_FORWARDING_QUEUE”。
我想要完成的是从数据框中的“语句”(如上所示)导入数据,并以如下方式排列它们:
id | authority objectType | authority name | authority mbox | stored | context platform | context extensions | actor objectType | actor name | ... |
---|---|---|---|---|---|---|---|---|---|
00 | Agent | xxx | mailto | 2022- | Unknown | http://1 | xxx | xxx | ... |
01 | Agent | yyy | mailto | 2022- | Unknown | http://2 | yyy | yyy | ... |
我们的想法是能够访问任何数据,例如“权限名称”或“参与者对象类型”。
我试过:
df = pd.DataFrame(list(collection.find(query)(filters)))
df = json_normalize(list(collection.find(query)(filters)))
使用各种查询、过滤器和切片,以及聚合和 map/reduce,但没有产生正确的输出。
我还想根据“存储”字段(sort('$natural',-1) ?)进行排序(从最新到最旧),并且也可能将 limit(xx) 应用于数据框。
有什么想法吗?
提前致谢。
试试这个
df = json_normalize(list(
collection.aggregate([
{
"$match": query
},
{
"$replaceRoot": {
"newRoot": "$statement"
}
}
])
)
感谢@pavel 的回答。它是正确的,几乎可以解决问题。
我还添加了排序和限制,所以如果有人感兴趣,最后的代码是这样的:
df = json_normalize(list(
statements_coll.aggregate([
{
"$match": query
},
{
"$replaceRoot": {
"newRoot": "$statement"
}
},
{
"$sort": {
"stored": -1
}
},
{
"$limit": 10
}
])
))