3 votes

Pandas comparer les lignes avec une condition

Disons que nous avons un dataframe d'exemple comme ci-dessous,

df = pd.DataFrame(np.array([['strawberry', 'red', 3], ['apple', 'red', 6], ['apple', 'red', 5],
                           ['banana', 'yellow', 9], ['pineapple', 'yellow', 5], ['pineapple', 'yellow', 7],
                           ['apple', 'green', 2],['apple', 'green', 6], ['kiwi', 'green', 6]
                           ]),
               columns=['Fruit', 'Color', 'Quantity'])

df

    Fruit       Color    Quantity
0   strawberry  red         3
1   apple       red         6
2   apple       red         5
3   banana     yellow       9
4   pineapple  yellow       5
5   pineapple  yellow       7
6   apple      green        2
7   apple      green        6
8   kiwi       green        6

Dans ce df, je vérifie s'il y a un changement dans la colonne Fruit ligne par ligne.

Avec la méthode shift(), les lignes sont décalées de 1, avec la méthode fillna(), les valeurs NaN sont remplies et enfin avec la méthode ne(), un étiquetage True-Faux est effectué.

Donc comme vous pouvez le vérifier à partir de l'index 1, la fraise change en pomme, cela donnera "True". À l'index 2, il n'y a aucun changement, cela donnera "False".

df['Fruit_Check'] = df.Fruit.shift().fillna(df.Fruit).ne(df.Fruit)
df
        Fruit        Color      Quantity    Fruit_Check
0     strawberry      red          3        False
1       apple         red          6        True
2       apple         red          5        False
3      banana        yellow        9        True
4     pineapple      yellow        5        True
5     pineapple      yellow        7        False
6       apple        green         2        True
7       apple        green         6        False
8       kiwi         green         6        True

Mon problème est le suivant: je veux également vérifier la colonne "Color". Si un changement s'y trouve, la colonne Fruit_Check doit être par défaut False. Ainsi, le df devrait ressembler à ceci,

df
        Fruit        Color      Quantity    Fruit_Check
0     strawberry      red          3        False
1       apple         red          6        True
2       apple         red          5        False
3      banana        yellow        9        False
4     pineapple      yellow        5        True
5     pineapple      yellow        7        False
6       apple        green         2        False
7       apple        green         6        False
8       kiwi         green         6        True

Je ne devrais pas non plus utiliser de boucle for. Parce que lorsque je l'utilise avec mes données d'origine, cela prend trop de temps.

2voto

jezrael Points 290608

Utilisez DataFrameGroupBy.shift pour shift par groupes :

df['Fruit_Check'] = df.groupby('Color').Fruit.shift().fillna(df.Fruit).ne(df.Fruit)
print (df)
        Fruit   Color Quantity  Fruit_Check
0  strawberry     red        3        False
1       apple     red        6         True
2       apple     red        5        False
3      banana  yellow        9        False
4   pineapple  yellow        5         True
5   pineapple  yellow        7        False
6       apple   green        2        False
7       apple   green        6        False
8        kiwi   green        6         True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X