2015-04-16 28 views
5

Ho un dataframe Pandas:Python: Pandas dataframe dalla serie di dict

type(original) 
pandas.core.frame.DataFrame 

che comprende la serie oggetto original['user']:

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

original['user'] punti ad un numero di dicts:

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

Ogni parola ha gli stessi tasti:

original['user'].ix[0].keys() 

[u'follow_request_sent', 
u'profile_use_background_image', 
u'profile_text_color', 
u'id', 
u'verified', 
u'profile_location', 
# ... keys removed for brevity 
] 

Sopra è (parte di) uno dei dit dei campi user in un tweet da tweeter API. Voglio costruire un data frame da questi dicts.

Quando provo a fare un frame di dati direttamente, ottengo solo una colonna per ogni riga e la colonna contiene tutta 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_.. 

Quando provo a generare un frame di dati utilizzando from_dict) I (ottenere lo stesso risultato:

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_.. 

Poi ho provato una lista di comprensione, che ha restituito un errore:

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

Quando creo un frame di dati da una singola fila, quasi funziona:

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 

Funziona quasi come lo voglio, tranne che imposta il campo description come indice di default.

Ognuno dei dit ha 40 tasti ma ho solo bisogno di circa 10 di essi e ho 28734 righe nel frame di dati.

Come posso escludere i tasti di cui non ho bisogno?

+1

Si dovrebbe usare read_json qui per ottenere questo in un unico dataframe. Utilizzare un DataFrame di DataFrames è una cattiva idea. –

+0

@ andy-hayden, ci ho pensato ma richiede un database di query aggiuntivo. Conservo i dati nel mongo db locale, ma voglio ridurre l'interazione tra python e mongo. – makambi

risposta

6

quello che vorrei cercare di fare è il seguente:

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

questo convertirà la serie di elencare poi passarlo al PANDAS dataframe e dovrebbe prendersi cura di tutto il resto.

3

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

funziona bene

credit