2016-06-28 14 views
0

Ich versuche, einen Datenrahmen dynamisch zu teilen, aber es funktioniert nicht (hier ist ein einfaches Beispiel):Splitting Datenrahmen dynamisch in Python

e = {'cat' : pd.Series(['A', 'B', 'C', 'D'])} 
cat = pd.DataFrame(e) 
cat.head(5) 

def splitter(val, outval): 
    outval = pd.DataFrame(cat['cat'] == "val") 

, was ich zu tun hoffen, ist ein Datensatz für jeden erstellen Wert der Variablen: ich bin der Hoffnung, die Funktion würde einen Datenrahmen ‚A‘ genannt erstellen, die den Wert ‚A‘ enthalten würde ..

splitter('A', 'myset') 

Antwort

0

Sie können Datenrahmen in einen einfacheren Weg Zugang:

cata = cat[cat['cat'] == 'A'] 
catb = cat[cat['cat'] == 'B'] 

Beachten Sie, dass pandas Ihnen eine Ansicht oder eine Kopie bietet, die vom Kontext abhängig ist. Dies wird erläutert in: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Dies bedeutet, dass beim Zurücksenden von Sichten die Daten vom zugrunde liegenden Dataset gesichert werden. Wenn Sie eine Kopie erhalten, werden Änderungen an dieser Kopie nicht im ursprünglichen Datensatz wiedergegeben.

Dies bedeutet, dass Sie vorsichtig sein müssen, wenn Sie das Ergebnis danach manipulieren. Wenn es sich um eine Kopie handelt, erhalten Sie viele Warnungen, wenn Schreibaktionen auftreten.

Sie scheinen Datenrahmen für alles zu erstellen, also sind wahrscheinlich nur die Kopien interessiert. In diesem Fall geht es hauptsächlich darum, ob alles in den Speicher passt oder nicht.

+0

danke, aber ich möchte den Datenrahmen dynamisch erstellen, so dass ich nicht 'Cata' oder 'Catb' eingeben muss, aber die Werte 'A' und 'B' werden automatisch zu CAT'A 'oder CAT'B durchgeleitet '.. – tezzaaa

1

Es gibt ein paar Probleme mit dem, was Sie haben. Hauptsächlich machen Sie Ihre Funktion nicht richtig, und Sie versuchen, die Zeichenfolge "val" aufzurufen, nicht die Variable val in Ihrer Gleichheit. Versuchen Sie folgendes:

data = {'cat' : ['A', 'B', 'C', 'D'], 'dog' : ['e', 'f', 'g', 'h']} 
df = pd.DataFrame(data) 
print(df) 

def splitter(df, val): 
    return df[df['cat'] == val] 

val = 'A'  
df_subset = splitter(df, val) 

Dies lässt Sie mit zwei Datenrahmen:

>df 
    cat dog 
0 A e 
1 B f 
2 C g 
3 D h 

>df_subset 
    cat dog 
0 A e 

Es gibt eigentlich keine Notwendigkeit für eine Funktion, das zu tun, aber ich habe es dort, damit Sie sehen können, wie die Funktion arbeitet. Beachten Sie insbesondere, dass Sie outval nicht darin eingeben, wenn Sie möchten, dass es zurückgegeben wird.

Einige andere Seite Hinweise:

Dataframes aus einem Wörterbuch mit den Werten als Listen erstellt werden, so gibt es keine Notwendigkeit Series zu nennen.

Benennen Sie Ihr Dataframe-Objekt nicht mit den Datenspalten, auf die Sie sich beziehen (in diesem Fall "Katze"), weil es nur verwirrend ist. Wenn Sie nur mit einem Datenrahmen arbeiten, verwenden Sie die Konvention df.

Anstatt eine Splitter-Funktion zu machen, können Sie für etwas so einfach tun: df_subset = df[df['cat'] == val], es sei denn, dies war nur ein Spielzeug-Beispiel und mehr muss natürlich innerhalb der Funktion passieren.

+0

danke, fast da: Weißt du, wie ich den Namen von' A 'im endgültigen Datenrahmennamen dynamisch übergeben könnte? so dass df_subset stattdessen df_subset_a heißt? auf diese Weise würden für jeden Wert von 'cat' verschiedene Teilmengen erzeugt werden. – tezzaaa

+0

Es könnte innerhalb einer Schleife gemacht werden. Zum Beispiel: 'für den Namen in ['A', 'B', 'C]: df [df [' cat '] == Name]' würde es dreimal machen, einmal für jedes Element in der Liste. Die Einzelheiten hängen davon ab, was Sie durchlaufen möchten und was Sie mit dem Ergebnis machen möchten. – Jeff