2 votes

Découpage de DataFrame en fonction de plusieurs conditions

J'espère que vous vous portez bien. J'ai une question concernant un DataFrame en Python.

Entreprise

Titre du poste

Nom de la personne

Apple

Fondateur

Steve Jobs

Apple

Cofondateur

Steve Wozniak

Microsoft

Fondateur

Bill Gates

Microsoft

Cofondateur

Paul Allen

Paypal

Cofondateur

Peter Thiel

Tesla

Membre du conseil d'administration

Larry Ellison

Tesla

DIRECTEUR FINANCIER

Zach Kirkhorn

Snapchat

Devan Fearman

Devan Fearman

Je voudrais filtrer et créer un nouveau Dataframe qui ne conserve que les lignes basées sur les conditions suivantes :

  1. si Fondateur, alors garder la ligne
  2. Si le fondateur n'est pas trouvé, alors le cofondateur.
  3. Si vous ne trouvez pas de cofondateur, alors un membre du conseil d'administration.
  4. Si vous ne trouvez pas de membre du conseil d'administration, alors le membre du conseil d'administration est le directeur financier.

Supprimez toutes les autres lignes du cadre de données. Notez que je ne suis autorisé à avoir qu'une seule ligne par entreprise.

Je voudrais donc obtenir le résultat suivant :

Entreprise

Titre du poste

Nom de la personne

Apple

Fondateur

Steve Jobs

Microsoft

Fondateur

Bill Gates

Paypal

Cofondateur

Peter Thiel

Tesla

Membre du conseil d'administration

Larry Ellison

Je suis sûr qu'il y a un moyen de le faire en utilisant une fonction de boucle, mais comme je suis très novice en Python, c'est encore très difficile pour moi. Je suis ouvert à l'utilisation de toutes les bibliothèques comme pandas et numpy. Veuillez expliquer votre code aussi clairement que possible.

J'espère avoir de vos nouvelles bientôt. Merci et faites-moi savoir si ma question n'était pas claire.

3voto

Quang Hoang Points 191

Vous pouvez utiliser pd.Category ici :

df['Job Title'] = pd.Categorical(df['Job Title'].str.strip(),
                                 categories=['Founder', 'Co-Founder', 'Board Member', 'CFO'],
                                 ordered=True
                                )

df.sort_values(['Job Title']).drop_duplicates('Company').dropna()

Sortie :

      Company     Job Title    Person Name
0      Apple        Founder     Steve Jobs
2  Microsoft        Founder     Bill Gates
4     Paypal     Co-Founder    Peter Thiel
5      Tesla   Board Member  Larry Ellison

1voto

wwnde Points 14457

Créez un dictionnaire de classement des titres de poste. Mettez en correspondance avec le titre du poste. Supprimez tout titre de poste ne figurant pas dans le classement. Triez les valeurs et supprimez les entreprises en double.

 d={'Founder':1,'Co-Founder':2,'Board Member':3,'Board Member CFO':4}
 df=df.assign(rank=df['JOB TITLE'].map(d)).sort_values(by='rank').dropna().drop_duplicates(subset=['COMPANY']).drop('rank', 1)

     COMPANY     JOB TITLE    PERSON NAME  rank
0      Apple       Founder     Steve Jobs     1
2  Microsoft       Founder     Bill Gates     1
4     Paypal    Co-Founder    Peter Thiel     2
5      Tesla  Board Member  Larry Ellison     3

0voto

Celius Stingher Points 11977

Je commencerais par créer une colonne supplémentaire Aux ce qui contribue à la Job Title priorité. Supposons que votre cadre de données échantillon soit défini comme suit df :

aux = {'Job Title':['Founder','Co-Founder','Board Member','CFO'],'Rank':[1,2,3,4]}
df['Rank'] = df['Job Title'].merge(aux,on='Job Title')
df_filtered = df.groupby('COMPANY')['Rank'].min().reset_index().merge(aux,on='Rank').drop(columns='Rank')

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