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
la réponse est vers le bas :) – amn89
grand travail agaim, @jezrael – pyd
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