2016-11-03 2 views
-1

Verwendung Wenn pymongo unter Verwendung von Daten von Mongo in einen Datenrahmen in Python exportieren i immer die Daten in dem Format ein paar Probleme habe ich magErste eine Mongo Sammlung Array in eine Python Datenrahmen pymongo

meine Daten in Mongo sieht aus, als folgt

db.data.findOne() 
"_id": ObjectId("581b1b0d077ad53847d27340") 
"index" : 0 
"item" : { 
     "bought" : 5.00 
     "sold" : 7.49 
} 

dann, wenn ich die folgenden Zeilen in python

pd.DataFrame(list(db.data.find())) 

i folgende

erhalten
id,      index, item 
581b1b0d077ad53847d27340 0 {'bought' : '5.00', 'sold' : '7.49'} 

während ich das Ergebnis möchte zu diesem Thema

id,      index, item.bought, item.sold 
581b1b0d077ad53847d27340 0  5.00  7.49 

jede Hilfe schauen, wie sehr geschätzt

+0

'db.data.find()' return 'json'? – jezrael

+0

ich folge nicht, sorry – WGP

+0

gleiche Idee wie 'MaxU' - verwenden' json_normalize'. – jezrael

Antwort

3

wäre IIUC Sie json_normalize() Methode verwenden:

In [78]: d = { 
    ...: "_id": "581b1b0d077ad53847d27340", 
    ...: "index" : 0, 
    ...: "item" : { 
    ...:  "bought": 5.00, 
    ...:  "sold": 7.49} 
    ...: } 
    ...: 

In [79]: pd.io.json.json_normalize(d) 
Out[79]: 
         _id index item.bought item.sold 
0 581b1b0d077ad53847d27340  0   5.0  7.49 

UPDATE: Parsing mehrere Einträge/Zeilen:

In [162]: data = [ 
    ...: {"_id": "581b1b0d077ad53847d27340", 
    ...: "index" : 0, 
    ...: "item" : { 
    ...:  "bought": 5.00, 
    ...:  "sold": 7.49} 
    ...: }, 
    ...: {"_id": "581b1b0d077ad53847d21111", 
    ...: "index" : 1, 
    ...: "item" : { 
    ...:  "bought": 55.00, 
    ...:  "sold": 99.99} 
    ...: }, 
    ...: ] 
    ...: 

In [163]: pd.io.json.json_normalize(data) 
Out[163]: 
         _id index item.bought item.sold 
0 581b1b0d077ad53847d27340  0   5.0  7.49 
1 581b1b0d077ad53847d21111  1   55.0  99.99 

PS data ist eine Liste der Wörterbücher, wobei jedes Wörterbuch einen Eintrag/row

UPDATE2 repräsentiert: wenn MongoDB kehrt item als String: "{'bought':5.00,'sold':'7.49'}" - wir können Vorprozess die Daten auf folgende Weise:

In [168]: from ast import literal_eval 

In [169]: data 
Out[169]: 
[{'_id': '0d', 'item': "{'bought':5.00,'sold':'7.49'}"}, 
{'_id': '1e', 'item': "{'bought':55.00,'sold':'157.90'}"}] 

In [171]: for i,x in enumerate(data): 
    ...:  data[i]['item'] = literal_eval(x['item']) 
    ...: 

In [172]: data 
Out[172]: 
[{'_id': '0d', 'item': {'bought': 5.0, 'sold': '7.49'}}, 
{'_id': '1e', 'item': {'bought': 55.0, 'sold': '157.90'}}] 

In [173]: pd.io.json.json_normalize(data) 
Out[173]: 
    _id item.bought item.sold 
0 0d   5.0  7.49 
1 1e   55.0 157.90 

Erläuterung:

In [170]: [literal_eval(x['item']) for x in data] 
Out[170]: [{'bought': 5.0, 'sold': '7.49'}, {'bought': 55.0, 'sold': '157.90'}] 
+0

Dies funktioniert wunderbar für ein Element zu einer Zeit, aber gibt es eine schnelle Möglichkeit, es für einen gesamten Datenrahmen ohne eine For-Schleife – WGP

+0

@WGP zu tun, überprüfen Sie UPDATE Abschnitt ... – MaxU

+0

Das Problem ist, dass, wenn ich von Mongo die exportieren Daten in dem Feld 'item' haben um sie herum, also für das obige Beispiel wäre es '' 'data = [{" _id ":" 0d "," item ":" {'gekaufte ": 5.00,' verkauft ' : '7.49'} "}, {" _ id ":" 1e "," item ":" {'gekauft ": 55.00,' verkauft ':' 157.90 '}"},] '' ' – WGP

Verwandte Themen