2017-10-15 1 views
2

J'ai un dataframe comme celui-civaleurs booléennes à des noms de colonne dans une liste, dataframe python pandas géants

 A B C D E 
    0 0.0 1.0 0.0 0.0 1.0 
    1 0.0 0.0 1.0 0.0 0.0 
    2 0.0 1.0 1.0 1.0 0.0 
    3 1.0 0.0 0.0 0.0 1.0 
    4 0.0 0.0 0.0 1.0 0.0 

La mission est d'obtenir une telle liste

0 B,E 
1 C 
2 B,C,D 
3 A,E 
4 D 

Toutes les idées, merci d'avance .

+0

la réponse est vers le bas :) – amn89

+1

grand travail agaim, @jezrael – pyd

+0

Dupliquer de https://stackoverflow.com/questions/32125954/pandas-map-0-1-data-frame-entries-to-column-names et https://stackoverflow.com/questions/38169342/python-pandas -dataframe-return-column-name – Zero

Répondre

3

Vous pouvez utiliser apply avec axis=1 pour le traitement par des lignes, puis de comparer chaque ligne avec 1 pour les valeurs d'index (car axis=1 chaque ligne est converti en série avec l'indice des colonnes) qui sont reliées par ,:

s1 = df.apply(lambda x: ','.join(x.index[x == 1]), axis=1) 
print (s1) 
0  B,E 
1  C 
2 B,C,D 
3  A,E 
4  D 
dtype: object 

Une autre solution, plus rapide si elle est plus grande DataFrame.

premier format de changement de colonnes à la liste:

print (['{}, '.format(x) for x in df.columns]) 
['A, ', 'B, ', 'C, ', 'D, ', 'E, '] 

même comme:

s = np.where(df == 1, ['{}, '.format(x) for x in df.columns], '') 

parce que 1 valeurs sont casté en True s. Comparer les valeurs de DataFrame et pour True format de l'utilisation personnalisée des noms de colonnes:

s = np.where(df, ['{}, '.format(x) for x in df.columns], '') 
print (s) 
[['' 'B, ' '' '' 'E, '] 
['' '' 'C, ' '' ''] 
['' 'B, ' 'C, ' 'D, ' ''] 
['A, ' '' '' '' 'E, '] 
['' '' '' 'D, ' '']] 

Dernière rejoindre toutes les lignes avec la suppression des valeurs vides:

s1 = pd.Series([''.join(x).strip(', ') for x in s], index=df.index) 
print (s1) 
0  B, E 
1   C 
2 B, C, D 
3  A, E 
4   D 
dtype: object 
+0

Génial réponse !, merci beaucoup :) – amn89