J'ai donc un pandas df (python 3.6) comme celui-ci
index A B C ... NewColumn A 1 5 0 [A,B] B 0 0 1 [C] C 1 2 4 [A,B,C] ...
Comme vous pouvez le voir, les valeurs d'index sont les mêmes que les noms de colonnes.
Quoi j'essaie de faire est d'obtenir une nouvelle colonne dans le dataframe qui porte le nom des colonnes où la valeur est> que 0
index A B C ... A 1 5 0 B 0 0 1 C 1 2 4 ...
j'ai essayé avec iterrows sans succès
aussi je sais que je peux fondre et pivoter mais je pense qu'il devrait y avoir un moyen d'appliquer lamnda peut-être?
Merci d'avance
3 Réponses :
Si la nouvelle colonne doit être une chaîne, comparez en DataFrame.gt avec Produit dot avec colonnes, dernier séparateur de fin de suppression:
df['NewColumn'] = df.gt(0).apply(lambda x: x.index[x].tolist(), axis=1) print (df) A B C NewColumn A 1 5 0 [A, B] B 0 0 1 [C] C 1 2 4 [A, B, C]
Et pour les listes, utilisez apply avec la fonction lambda:
df['NewColumn'] = df.gt(0).dot(df.columns + ', ').str.rstrip(', ')
print (df)
A B C NewColumn
A 1 5 0 A, B
B 0 0 1 C
C 1 2 4 A, B, C
Utiliser :
df['NewColumn'] = df.apply(lambda x: list(x[x.gt(0)].index),axis=1) A B C NewColumn A 1 5 0 [A, B] B 0 0 1 [C] C 1 2 4 [A, B, C]
Vous pouvez utiliser . gt pour vérifier quelles valeurs sont supérieures à 0 et .dot pour obtenir les colonnes correspondantes. Enfin .apply (list) pour transformer les résultats en listes:
df.loc[:, 'NewColumn'] = ((df.gt(0) @ df.columns.map('{},'.format))
.str.rstrip(',').str.split(','))
A B C NewColumn
index
A 1 5 0 [A, B]
B 0 0 1 [C]
C 1 2 4 [A, B, C]
Remarque : fonctionne avec des colonnes à une seule lettre, sinon vous pourriez faire:
df.loc[:, 'NewColumn'] = df.gt(0).dot(df.columns).apply(list)
A B C NewColumn
index
A 1 5 0 [A, B]
B 0 0 1 [C]
C 1 2 4 [A, B, C]