2016-04-14 15 views
0

Wenn ich eine CSV-Datei Zeilen habe, in denen eine Spalte dictricts in ihnen hat, wie erstelle ich eine neue Spalte extrahieren ein einzelnes Element jedes Ordereddict mit Python (3. +)/Pandas (. 18)?Wie extrahiert man aus einem Array von Ordereddicts einen Wert?

Hier ist ein Beispiel. Meine Spalte, attributes, hat billingPostalCodes versteckt in ordereddicts. Alles, was mir wichtig ist, ist eine Spalte mit der billingPostalCodes erstellen.

Hier ist, was meine Daten jetzt aussieht:

import pandas as pd 
from datetime import datetime 
import csv 
from collections import OrderedDict 

df = pd.read_csv('sf_account_sites.csv') 
print(df) 

ergibt:

id attributes 
    1 OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'85020')]) 
    2 OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'55555')]) 
    ... 

ich auf individueller Ebene, ob ich das tun:

dict = OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'85020')]) 

print(dict['BillingPostalCode']) 

Ich werde 85020 zurück als Ergebnis.

Was muss ich tun, damit es so aussieht?

id zip_codes 
    1 85020 
    2 55555 
    ... 

Muss ich eine Anwendungsfunktion verwenden? Eine for-Schleife? Ich habe viele verschiedene Dinge ausprobiert, aber ich kann nichts am Datenrahmen arbeiten.

Vielen Dank im Voraus, und lassen Sie mich wissen, wenn ich genauer sein muss.

Antwort

0

nahm mir das eine Weile heraus zu arbeiten, aber das Problem, indem Sie die behoben ist folgende:

df.apply(lambda row: row["attributes"]["BillingPostalCode"], axis = 1) 

Der Trick hier ist zu beachten, dass axis = 1 Kräfte pandas durch jede Zeile zu wiederholen, anstatt jede Spalte (Dies ist die Standardeinstellung, wie in der docs zu sehen).

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

Applies function along input axis of DataFrame.

Objects passed to functions are Series objects having index either the DataFrame’s index (axis=0) or the columns (axis=1). Return type depends on whether passed function aggregates, or the reduce argument if the DataFrame is empty.

Parameters:

  • func : function Function to apply to each column/row
  • axis : {0 or ‘index’, 1 or ‘columns’}, default 0
    • 0 or ‘index’: apply function to each column
    • 1 or ‘columns’: apply function to each row

Von dort aus ist es eine einfache Sache, zuerst die entsprechende Spalte zu extrahieren - in diesem Fall attributes - und dann von dort nur die BillingPostalCode zu extrahieren.

Sie müssen den resultierenden DataFrame formatieren, um die richtigen Spaltennamen zu erhalten.

+0

Das sieht so aus, als ob es funktionieren sollte, aber ich bekomme 'TypeError: ('String-Indizes müssen ganze Zahlen sein,' trat bei Index 0 auf '), wenn ich das versuche. Irgendeine Idee warum das der Fall ist? –

+0

@AndrewKraemer Ich habe das an dem von Ihnen zitierten Beispiel getestet und es hat gut funktioniert. Welche Version von Pandas benutzt du? Ich bin auf Pandas 0.18. Ich vermute, dass in einer älteren Pandas-Version die Indexierung der Zeilen mit Ganzzahlen und nicht mit Spaltennamen erfolgt. Versuchen Sie stattdessen 'row [1] ["BillingPostalCode"] '. –

+0

Ich bin tatsächlich auf .18. Ich lief, was Sie empfohlen haben und bekam das gleiche Problem. Ich kann den tatsächlichen Datensatz hochladen, wenn es helfen würde. Es scheint, dass die Daten in der Spalte Attribute als String gespeichert werden, wo es ein Collections.OrderedDict funktionieren muss. Nicht sicher, wie Sie die Zeichenfolge in OderedDict konvertieren. –

Verwandte Themen