2 votes

Cadre de données Pandas - Sélection de produits uniques

Voici la base de données des voitures :

df = pd.DataFrame({ 'car' : ['brand1_2020', 'brand2', 'brand3', 'brand1_2018', 'brand4'],
                 'score' : [5.2, 4.9, 5.0, 5.1, 4.1]})

Je dois sélectionner les 3 premières voitures dont la marque est unique (par exemple, il y a deux colonnes pour la marque 1 : marque 1_2020 et marque 1_2018). Je dois sélectionner une seule voiture de la marque 1 avec le score le plus élevé).

cars_filtered = df.iloc[np.argsort(np.abs(df['score']))[-3:]].car.tolist()

Cela produit : ['brand3', 'brand1_2018', 'brand1_2020'] mais nous devons obtenir ['brand2', 'brand3', 'brand1_2020'] .

Comment faire ? :) Merci beaucoup !

3voto

Derek O Points 4883

J'envisagerais de diviser les chaînes de caractères dans la section 'cars' et créer une nouvelle colonne appelée marque :

df['brand'] = [x[0] for x in df['car'].str.split("_")]

Cela vous permettra de traiter 'brand1_2021' y 'brand1_2018' comme le même 'brand1' catégorie.

>>> df
           car  score   brand
0  brand1_2020    5.2  brand1
1       brand2    4.9  brand2
2       brand3    5.0  brand3
3  brand1_2018    5.1  brand1
4       brand4    4.1  brand4

Vous pouvez ensuite trier le DataFrame par score, du plus grand au plus petit, en supprimant les entrées répétées sous la balise 'brand' et sélectionnez les trois premières valeurs de la colonne d'origine. 'car' colonne :

df.sort_values(by="score", ascending=False).drop_duplicates(subset="brand").car[0:3].to_list()

Sortie :

['brand1_2020', 'brand3', 'brand2']

1voto

sammywemmy Points 14854

Regroupement par les préfixes ( brand1 ...), obtenir les booléens, et finalement garder les trois premiers :

bools = df.car.str.split('_').str[0]
bools = df.groupby(bools).score.transform('max')
df.loc[df.score == bools].nlargest(3, 'score').car.tolist()

['brand1_2020', 'brand3', 'brand2']

0voto

texasraj Points 33

Df['brand'] = [x[0] for x in df['car'].str.split("_")] df.sort_values(by="score", ascending=False).drop_duplicates(subset="brand").car[0:3].to_list()

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