3
votes

python 3 récupère le nom de la colonne en fonction d'une condition

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


0 commentaires

3 Réponses :


4
votes

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


0 commentaires

3
votes

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]


0 commentaires

3
votes

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]


0 commentaires