2017-09-25 6 views
0

J'ai une dataframe dont je ne veux pas créer de sous-ensembles dans une boucle en fonction des valeurs d'une colonne.Créer des sous-ensembles dans une boucle en fonction des valeurs d'une colonne dans pandas dataframe

Voici un exemple df:

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

Je souhaite créer des sous-ensembles comme si dans une boucle

première itération, sélectionner toutes les rangées dans lesquelles C1 = A, et seules les colonnes 2 et 3 , d'autre part, toutes les lignes dans lesquelles C1 = B, et seulement C2 et 3.

I ont essayé le code suivant:

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 

mais le sous-ensemble n'est pas effectué. Comment itérer throudh les niveaux d'une colonne

Par exemple, dans R, il serait

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

Merci

Répondre

1

Il n'y a pas besoin de l'enumerate qui donne à la fois l'indice et les valeurs, la boucle juste par c1 colonne directement:

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 

Très probablement, ce dont vous avez besoin est df.groupby('c1').apply(lambda g: ...), ce qui devrait être une approche plus efficace; Ici g est la sous-trame de données avec une valeur unique c1.

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 

Or (celui-ci est plus comme 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

Je cherchais aussi sur la façon de sous-ensemble des lignes et des colonnes dans le même appel au lieu de mon .loc et .iloc dans la même ligne de code. – Boidot

+0

@Boidot vous pouvez vérifier la réponse de Psidom. – Wen