2016-12-05 4 views
-1

Ich habe einen Datenrahmen dfErstellen neuer Datenrahmen in Pandas mit dynamischen Namen auch hinzufügen neue Spalte

df = pd.DataFrame({'A':['-a',1,'a'], 
       'B':['a',np.nan,'c'], 
       'ID':[1,2,2], 
       't':[pd.tslib.Timestamp.now(),pd.tslib.Timestamp.now(), 
        np.nan]}) 

Added eine neue Spalte

df['YearMonth'] = df['t'].map(lambda x: 100*x.year + x.month) 

Jetzt möchte ich eine Funktion oder ein Makro schreiben, die tun Datum Vergleich, erstellen Sie einen neuen Datenrahmen und fügen Sie dem Datenrahmen eine neue Spalte hinzu.

ich so versucht, aber scheine, dass ich falsch bin dabei:

def test(df,ym): 
    df_new=df 
    if(ym <= df['YearMonth']): 
     df_new+"_"+ym=df_new 
     return df_new+"_"+ym 
    df_new+"_"+ym['new_col']=ym 

Nun, wenn ich Testfunktion aufrufen möchte ich einen neuer Datenrahmen sollte als df_new_201612 und dieser neue Datenrahmen sollte eine weitere Spalte mit dem Namen erstellt wird, hat mit dem Namen als new_col, die für alle Zeilen den Wert ym hat.

test(df,201612) 

Die Ausgabe neuen Datenrahmen ist:

df_new_201612

A B ID t       YearMonth new_col 
-a a 1 2016-12-05 12:37:56.374620 201612  201612 
1 NaN 2 2016-12-05 12:37:56.374644 201208  201612 
a c 2 nat       nan   201612 
+0

Ihr Code ist nicht gültig Python - die Linie 'df_new + "neue" + ym [ 'new_col'] = ym' einen' SnytaxError' wirft. Ich glaube auch nicht, dass 'return df_new +" _ "+ ym' das tut, was Sie denken, dass es tut. – nlsdfnbch

+0

Ich weiß, dass ich etwas falsch mache. Bitte lassen Sie mich wissen, wenn Sie eine Idee, oben in Pandas – user07

+0

implementieren wissen jemand weiß, wie man mit Nan umgehen ... unten Lösung funktioniert, wenn ich keine Nan-Wert in YearMonth haben. Wie man es schafft, wenn wir auch Nan haben? – user07

Antwort

3

Erstellen von Variablen mit dynamischen Namen sind in der Regel eine schlechte Praxis.

Ich denke, die beste Lösung für Ihr Problem ist, Ihre Datenframes in einem Wörterbuch zu speichern und dynamisch den Namen des Schlüssels zu generieren, um auf jeden Datenrahmen zuzugreifen.

import copy 

dict_of_df = {} 
for ym in [201511, 201612, 201710]: 

    key_name = 'df_new_'+str(ym)  

    dict_of_df[key_name] = copy.deepcopy(df) 

    to_change = df['YearMonth']< ym 
    dict_of_df[key_name].loc[to_change, 'new_col'] = ym 

dict_of_df.keys() 
Out[36]: ['df_new_201710', 'df_new_201612', 'df_new_201511'] 

dict_of_df 
Out[37]: 
{'df_new_201511':  A B ID      t YearMonth new_col 
0 -a a 1 2016-12-05 07:53:35.943  201612 201612 
1 1 NaN 2 2016-12-05 07:53:35.943  201612 201612 
2 a c 2 2016-12-05 07:53:35.943  201612 201612, 
'df_new_201612':  A B ID      t YearMonth new_col 
0 -a a 1 2016-12-05 07:53:35.943  201612 201612 
1 1 NaN 2 2016-12-05 07:53:35.943  201612 201612 
2 a c 2 2016-12-05 07:53:35.943  201612 201612, 
'df_new_201710':  A B ID      t YearMonth new_col 
0 -a a 1 2016-12-05 07:53:35.943  201612 201710 
1 1 NaN 2 2016-12-05 07:53:35.943  201612 201710 
2 a c 2 2016-12-05 07:53:35.943  201612 201710} 

# Extract a single dataframe 
df_2015 = dict_of_df['df_new_201511'] 
+0

i habe es nicht verstanden. Meine Anforderung ist, Testfunktion mit vielen Jahrmonatigen Werten aufzurufen und separaten Datenrahmen dieses Jahrmonat zu erzeugen. Es wäre hilfreich, wenn Sie mir mit Beispiel erklären können, was genau Sie versuchen zu sagen – user07

+0

Ist das Erstellen von dynamisch benannten Variablen sogar in Python möglich? Ich habe es mit Anaconda3 versucht, aber ich bekomme 'SyntaxErrors' links und rechts? – nlsdfnbch

+0

Ein Beispiel zur Verdeutlichung hinzugefügt – FLab

Verwandte Themen