2015-04-16 13 views
5

Ich habe einen Pandas Datenrahmen:Python: Pandas Datenrahmen aus der Serie von dict

type(original) 
pandas.core.frame.DataFrame 

, die die Objekt-Serie umfasst original['user']:

type(original['user']) 
pandas.core.series.Series 

original['user'] verweist auf eine Reihe von dicts:

type(original['user'].ix[0]) 
dict 

Jedes Diktat hat die gleichen Schlüssel:

Oben ist (Teil von) einer der dicts von user Felder in einem Tweet von tweeter API. Ich möchte aus diesen Diktaten einen Datenrahmen aufbauen.

Wenn ich versuche, einen Datenrahmen direkt zu machen, bekomme ich nur eine Spalte für jede Zeile und diese Spalte enthält die gesamte dict:

pd.DataFrame(original['user'][:2]) 
    user 
0 {u'follow_request_sent': False, u'profile_use_... 
1 {u'follow_request_sent': False, u'profile_use_.. 

Wenn ich versuche, einen Datenrahmen mit from_dict() I zu erstellen erhalten das gleiche Ergebnis:

pd.DataFrame.from_dict(original['user'][:2]) 

    user 
0 {u'follow_request_sent': False, u'profile_use_... 
1 {u'follow_request_sent': False, u'profile_use_.. 

Next ich eine Liste Verständnis versuchte, die einen Fehler zurückgegeben:

item = [[k, v] for (k,v) in users] 
ValueError: too many values to unpack 

Wenn ich einen Datenrahmen aus einer einzigen Zeile zu erstellen, es funktioniert fast:

df = pd.DataFrame.from_dict(original['user'].ix[0]) 
df.reset_index() 

    index contributors_enabled created_at default_profile  default_profile_image description  entities favourites_count follow_request_sent  followers_count  following friends_count geo_enabled  id id_str is_translation_enabled is_translator lang listed_count location name notifications profile_background_color profile_background_image_url profile_background_image_url_https profile_background_tile  profile_image_url profile_image_url_https  profile_link_color profile_location profile_sidebar_border_color profile_sidebar_fill_color profile_text_color profile_use_background_image protected screen_name  statuses_count time_zone url  utc_offset verified 
0 description  False Mon May 26 11:58:40 +0000 2014 True False  {u'urls': []} 0 False 157 

Es funktioniert fast wie ich es will, es sei denn es das description Feld als Standard-Index setzt.

Jedes der dicts hat 40 Tasten, aber ich brauche nur etwa 10 von ihnen und ich habe 28734 Zeilen im Datenrahmen.

Wie kann ich die Tasten herausfiltern, die ich nicht brauche?

+1

Sie sollten hier verwenden read_json dies in einem einzigen Datenrahmen zu erhalten. Die Verwendung eines DataFrame von DataFrames ist eine schlechte Idee. –

+0

@ andy-hayden, ich dachte darüber nach, aber es erfordert zusätzliche Datenbank Abfrage. Ich speichere Daten in lokalen Mongo db, aber ich möchte die Interaktion zwischen Python und Mongo reduzieren. – makambi

Antwort

6

was ich versuchen würde, zu tun, ist die folgende:

new_df = pd.DataFrame(list(original['user'])) 

dies die Serie umwandeln aufzulisten dann geben sie Datenrahmen Pandas und es sollte sich um den Rest kümmern.

3

df = original['user'].apply(pd.Series)

funktioniert gut

credit

Verwandte Themen