Comment faire cette opération en utilisant des pandas?

Df initial:

    A B C D
0   0 1 0 0
1   0 1 0 0
2   0 0 1 1
3   0 1 0 1
4   1 1 0 0
5   1 1 1 0

Df final:

    A B C D Param
0   0 1 0 0     1
1   0 1 0 0     0
2   0 0 1 1     2
3   0 1 0 1     0
4   1 1 0 0     1
5   1 1 1 0     0

Fondamentalement, Param est le numéro du 1 de cette ligne qui apparaît pour la première fois dans sa propre colonne. Exemple: l'index 0: 1 dans la colonne B apparaît pour la première fois donc Param1 = 1

Index 1: aucun des 1 n'apparaît pour la première fois dans sa propre colonne d'où Param1 = 0

Index 2: 1 dans la colonne C et D apparaît pour la première fois dans leurs colonnes d'où Paramm1 = 2

Index 3: aucun des 1 n'apparaît pour la première fois dans sa propre colonne d'où Param1 = 0

Index 4: 1 dans la colonne A apparaît pour la première fois dans la colonne d'où Paramm1 = 1

Index 5: aucun des 1 n'apparaît pour la première fois dans sa propre colonne d'où Param1 = 0

1
Kundan 30 mai 2020 à 04:44

3 réponses

Meilleure réponse

Je vais faire idxmax et value_counts

df['Param']=df.idxmax().value_counts().reindex(df.index,fill_value=0)
df
   A  B  C  D  Param
0  0  1  0  0      1
1  0  1  0  0      0
2  0  0  1  1      2
3  0  1  0  1      0
4  1  1  0  0      1
5  1  1  1  0      0
1
YOBEN_S 30 mai 2020 à 01:56

IIUC, vous pouvez vérifier les valeurs en double, multiplier par df et additionner:

df['Param'] = df.apply(lambda x: ~x.duplicated()).mul(df).sum(1)

Production:

   A  B  C  D  Param
0  0  1  0  0      1
1  0  1  0  0      0
2  0  0  1  1      2
3  0  1  0  1      0
4  1  1  0  0      1
5  1  1  1  0      0
1
Quang Hoang 30 mai 2020 à 01:47

En supposant que ce sont des entiers, vous pouvez utiliser cumsum () deux fois pour isoler la première occurrence de 1.

df2 = (df.cumsum() > 0).cumsum() == 1
df['Param'] = df2.sum(axis = 1)
print(df)

Si les éléments df sont des chaînes, vous devez d'abord les convertir en entiers.

df = df.astype(int)
0
LevB 30 mai 2020 à 07:47