2017-05-29 3 views
0

ich diesesmit Daten in einem Wörterbuch Spalten auf einem Pandas Datenrahmen hinzufügen

 date_loc  timestamp 
id                  
1  2017-05-29 1496083649 
2  2017-05-29 1496089320 
3  2017-05-29 1496095148 
4  2017-05-30 1496100936 
... 

und ein dict wie diese

observations = { 
    '1496089320': { 
     'col_a: 'value_a', 
     'col_b: 'value_b', 
     'col_c: 'n/a' 
    }, 
    '1496100936' : { 
     'col_b: 'value_b' 
    }, 
    ... 
} 

Ich möchte alle hinzufügen die eine Pandas Dataframe p_df wie haben Werte, die innerhalb des observations Unterdikts mit ihren jeweiligen Schlüsseln als Spaltennamen enthalten sind, wenn die Schlüssel im dict auch in den timestamp Spalten existieren, so dass der resultierende Datenrahmen

ist
 date_loc  timestamp  col_a col_b col_c 
id                  
1  2017-05-29 1496083649 
2  2017-05-29 1496089320 value_a value_b  n/a 
3  2017-05-29 1496095148 
4  2017-05-30 1496100936   value_b 
... 

habe ich versucht, mit verschiedenen Methoden (agg(), apply(), iterrows()), aber nichts funktioniert noch. Hier ist zum Beispiel meines letzten Versuch

p_df['col_a'] = '' 
p_df['col_b'] = '' 
p_df['col_c'] = '' 

for index, row in p_df.iterrows(): 
    ts = p_df.loc[index, 'timestamp'] 
    if ts in observations: 
     # how to concat column values in this row? 
    # end if 
#end for 

wohl fühle ich mich gibt es auch einen besseren Ansatz als Zeilen des Datenrahmen laufen, so dass ich bin offen für bessere Alternativen als diese.

Antwort

1

Sie können einen Datenrahmen aus dem Wörterbuch konstruieren und dann mit dem ursprünglichen Datenrahmen auf den timestamp Spalt fusionieren:

import pandas as pd 
# make sure the timestamp columns are of the same type 
df.timestamp = df.timestamp.astype(str) 
​ 
df.merge(pd.DataFrame.from_dict(observations, 'index'), 
     left_on='timestamp', right_index=True, how='left').fillna('') 

#  date_loc timestamp col_b col_c col_a 
#id     
#1 2017-05-29 1496083649   
#2 2017-05-29 1496089320 value_b n/a value_a 
#3 2017-05-29 1496095148   
#4 2017-05-30 1496100936 value_b  
+0

es funktioniert fast, danke, aber 1) mit 'fillna()' Ich habe diese error: 'raise AssertionError (" Lücken in blk ref_locs ")', ohne dass es funktioniert: 2) in meinem dict habe ich viele Schlüssel nicht im Datenframe enthalten, so dass die Zusammenführung mir viele leere Zeilen gibt – fcalderan

+0

Sorry, nicht Lesen Sie Ihre Frage sehr sorgfältig. Sieht so aus, als ob du einen Link anstelle eines vollen Joins brauchst. Nicht sicher über das 'fillna()' Problem obwohl. Ich bin noch nie auf einen Fehler mit "fillna" wie diesem gestoßen. – Psidom

+1

danke, mit einem linken Join funktioniert gut. – fcalderan

Verwandte Themen