python - 将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

标签 python json mongodb pandas pymongo

我正在尝试将 mongoDB 文档转换为平面 pandas 数据帧结构。

我的 mongoDB 集合结构的示例:

data = collection.find_one({'ID':300})
print(data)

{'_id': "ObjectId('5cd932299f6b7d4c9b95af6c')",
 'ID': 300,
 'updated': 23424,
 'data': [
     { 'meta': 8,
       'data': [
           {'value1': 1, 'value2': 2}, 
           {'value1': 3, 'value2': 4}
       ]
     },
     { 'meta': 9,
       'data': [
           {'value1': 5, 'value2': 6}
       ]
     }
  ]
}

当我将其放入 pandas 数据框中时,我得到

df = pd.DataFrame(data)
print(df)

| _id                      | ID  | updated | data                                              
|
|--------------------------|-----|---------|------------------------ ---------------------------|
| 5cd936779f6b7d4c9b95af6d | 300 | 23424   | {'meta': 8, 'data': [{'value1': 1, 'value2': 2... |
| 5cd936779f6b7d4c9b95af6d | 300 | 23424   | {'meta': 9, 'data': [{'value1': 5, 'value2': 6}]} |

当我使用 pd.concat 迭代数据帧时,我得到

df.rename(columns={'data':'data1'}, inplace=True)
df2 = pd.concat([df, pd.DataFrame(list(df['data1']))], axis=1).drop('data1', 1)
df3 = pd.concat([df2, pd.DataFrame(list(df2['data']))], axis=1).drop('data', 1)
print(df3)

| _id                      | ID  | updated | meta | 0                          | 1                          |
|--------------------------|-----|---------|------|----------------------------|----------------------------|
| 5cd936779f6b7d4c9b95af6d | 300 | 23424   | 8    | {'value1': 1, 'value2': 2} | {'value1': 3, 'value2': 4} |
| 5cd936779f6b7d4c9b95af6d | 300 | 23424   | 9    | {'value1': 5, 'value2': 6} | None                       |

最低级别数组的最低级别对象始终具有相同的名称。

因此我想要:

| ID  | updated | meta | value1 | value2 |
|-----|---------|------|--------|--------|
| 300 | 23424   | 8    | 1      | 2      |
| 300 | 23424   | 8    | 3      | 4      |
| 300 | 23424   | 9    | 5      | 6      |

我是不是走错了路?

解决这个问题最方便的方法是什么?

最佳答案

@sinB - 您可以通过删除 for 循环来进一步改进这一点(在处理包含许多文档的数据库时,它会导致问题)。无论如何,您都不需要循环,因为可以使用单个命令将结果转换为 pandas 数据帧。

而不是这个:

#add each doc as a new row in dataframe
for doc in collection.aggregate(pipeline): 
    df = df.append(doc,ignore_index=True)

你可以使用这个

query_result = collection.aggregate(pipeline)
query_result = list(query_result)
df = pd.io.json.json_normalize(query_result)

关于python - 将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56110352/

相关文章:

python - 将 XML 解析为具有相同节点的 python 中的数据框

python - 如何找到 OpenGL 顶点的 PyGame 窗口坐标?

python - python中的多项式回归模型

json - 在Powershell中过滤JSON

c# - MongoDB C# 驱动程序 - 更新嵌入式文档数组中的所有字段

python - 将 pandas 数据透视表导出到 csv

java - JAX-RS 自动将 List<Object> 编码为 JSON

java - 使用 java 从 MongoDB 提取时处理空值

java - MongoDB - 分组依据 - 聚合 - java

javascript - 如何在Ajax中解析字符串数组?