CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Pandas casse-tête

MonsieurBeauf
MonsieurBeauf
Niveau 10
24 octobre 2019 à 18:52:18

Heyheyhey need help pour une tâche que je dois faire. Une démo sera plus simple que des explications inutiles :


DF1 :
   A    B   
0  a1  b0 
1  a1  b1 
2  a2  b2 
3  a2  b3 
4  a3  b5 

DF2 : 
     A  B   C
0   a1  b0  c0
1   a1  b1  c1
2   a1  b9  c2
3   a2  b2  c3
4   a2  b3  c4
5   a2  b4  c5
6   a3  b5  c6
7   a4  b11 c7

mon résultat doit être : 

DF3 : 
     A  B   C
0  a1   b9  c2
1  a2   b4  c5

Donc en gros :

je ne prends les lignes de DF2 que si le A est commun avec DF1 mais le B présent que dans DF2. Exemple :
pour a1 : b0 et b1 sont dans DF1 et DF2 mais b9 n'est que dans DF2 donc on prend a1 b9 c2 ( la ligne quoi), même principe pour a2, a2 présent dans DF1 et DF2, b2 et b3 présents dans DF2 mais b4 de DF2 pas présent dans DF1 donc on prend la ligne a2 b4 c5.

Aussi, si dans DF2 il y a des A non présents dans DF1, quelque soit le B associé, il ne doit pas apparaître ( dans l'exemple c'est le cas de a4 ).

Tout est sous forme de dataFrame donc j'attends des trucs style ~isin etc.. qui me prend le moins de temps possible, je suis sur des très gros CSV je peux pas me permettre de faire 3 for imbriqués ahah

Grimmys
Grimmys
Niveau 19
26 octobre 2019 à 13:02:01

Salut,

Je ne comprends pas trop ce que tu entends par " des trucs style ~isin etc.. ", mais pour le coup je vois pas trop d'autre solution que de parcourir ta matrice DF2, et pour chaque élément, parcourir DF1 (donc des for imbriqués en effet). :(

Ca va prendre du temps oui, mais avec les bonnes conditions, tu auras ce que tu veux au final.

godrik
godrik
Niveau 30
26 octobre 2019 à 18:28:48

utilise un dictionnaire.

_ZawaZawaZawa_
_ZawaZawaZawa_
Niveau 9
26 octobre 2019 à 19:20:55

je vois pas trop d'autre solution que de parcourir ta matrice DF2, et pour chaque élément, parcourir DF1 (donc des for imbriqués en effet)

il y a probablement une syntaxe moins naze dans la doc des dataframes pandas (en interne ça refera des for imbriqués mais bon c'est plus élégant quand même de reprendre les fonctionnalités de la lib plutôt que de réimplémenter)

MonsieurBeauf
MonsieurBeauf
Niveau 10
27 octobre 2019 à 10:32:30

Salut, j'ai trouvé une solution triviale en fait. C'est juste que je ne connaissais pas assez bien la bibliothèque pandas. En gros la solution est littéralement "je prend de DF2 les lignes de DF1 qui ont en commun l'attribut A mais pas l'attribut B" en sql ça se fait très facilement mais avec pandas, si ça peut aider des gens dans le futur ça ressemble à ça :

import pandas as pd



DF1 = pd.DataFrame({'A':['a1','a1','a2','a2','a3'],'B':['b0','b1','b2','b3','b5']}) # on déclare DF1
DF2 = pd.DataFrame({'A':['a1','a1','a1','a2','a2','a2','a3','a4'],
                    'B':['b0','b1','b9','b2','b3','b4','b5','b11'],
                    'C':['c0','c1','c2','c3','c4','c5','c6','c7']}) # on déclare DF2


print(DF1,"\n")
print(DF2,"\n")
print( DF2[ (DF2.A.isin(DF1.A)) & (~DF2.B.isin(DF1.B)) ] ) #on a DF3

Le 26 octobre 2019 à 19:20:55 _ZawaZawaZawa_ a écrit :

je vois pas trop d'autre solution que de parcourir ta matrice DF2, et pour chaque élément, parcourir DF1 (donc des for imbriqués en effet)

il y a probablement une syntaxe moins naze dans la doc des dataframes pandas (en interne ça refera des for imbriqués mais bon c'est plus élégant quand même de reprendre les fonctionnalités de la lib plutôt que de réimplémenter)

Effectivement pandas est beaucoup plus riche que ce que j'imaginais et leurs algorithmes sont très très bons, je sais pas s'ils font parallélisme ou font des tables de #/indexation car rien que l'équivalent d'un SELECT en sql se fait incroyablement plus rapidement avec la syntaxe pandas qu'avec une boucle for qui va bêtement parcourir ligne par ligne et garder les occurences.

Message édité le 27 octobre 2019 à 10:36:43 par MonsieurBeauf
Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment