2017-09-25 3 views
0

Ich habe ein Datenframe, von dem ich Subsets in einer Schleife nach den Werten einer Spalte erstellen möchte. HierErstellen von Teilmengen in einer Schleife nach einer Spalte Werte in Pandas Datenrahmen

ist ein Beispiel df:

c1  c2  c3 
A   1  2 
A   2  2 
B   0  2 
B   1  1 

Ich möchte Teilmengen erzeugen, wie dies in einer Schleife

ersten Iteration, wählen alle Zeilen, in denen C1 = A, und nur die Spalten 2 und 3 , zweitens, werden alle Zeilen, in denen B = C1 und C2 nur und 3.

I den folgenden Code versucht haben:

for level in enumerate(df.loc[:,"C1"].unique()): 

    df_s = df.loc[df["C1"]==level].iloc[:, 1:len(df.columns)] 
    #other actions on the subsetted dataframe 

, aber die Teilmenge wird nicht ausgeführt. Wie throudh die Ebenen einer Spalte

Zum Beispiel in R iterieren wäre es

for (le in levels(df$C1){ 
dfs <- df[df$C1==le,2:ncol(df)] 
} 

Dank

Antwort

1

Es besteht keine Notwendigkeit für die enumerate, die sowohl Index und Werte, nur Schleife gibt durch c1 Spalte direkt:

for level in df.c1.unique(): 
    df_s = df.loc[df.c1 == level].drop('c1', 1) 
    print(level + ":\n", df_s) 

#A: 
# c2 c3 
#0 1 2 
#1 2 2 
#B: 
# c2 c3 
#2 0 2 
#3 1 1 

Am wahrscheinlichsten ist, was Sie brauchen, ist df.groupby('c1').apply(lambda g: ...), die ein effizienter Ansatz sein sollte; Hier ist g der Subdatenrahmen mit einem eindeutigen c1 Wert.

0
for level in df.loc[:,"c1"].unique(): 
    print(level) 
    df_s = df.loc[df["c1"]==level,:].iloc[:,1:len(df)] 

    print(df_s) 

A 
    c2 c3 
0 1 2 
1 2 2 
B 
    c2 c3 
2 0 2 
3 1 1 

Oder (dies ist eher wie R)

for level in df.loc[:,"c1"].unique(): 
    print(level) 
    df_s = df.loc[df["c1"]==level,df.columns[1:len(df)]] 
    print(df_s) 
+0

Ich war auf der Suche auch auf, wie Zeilen und Spalten im selben Aufruf der Teilmenge statt meiner .loc und .iloc in der gleichen Zeile von Code. – Boidot

+0

@Boidot können Sie Psidoms Antwort überprüfen. – Wen

Verwandte Themen