2 votes

Comparer 2 cadres de données dans pandas sur la base de la valeur d'une colonne

J'ai 2 cadres de données. Le premier "named x" a le format suivant :

             ISBN  Age Category  Count
20     000649840X  Middle Adult      6
21     000649840X   Young Adult     16

Où Le même ISBN a plusieurs lignes avec des catégories différentes.

L'autre cadre de données "named y" comporte une ligne pour chaque valeur ISBN. Je veux créer deux colonnes dans le dernier cadre de données, une pour chaque catégorie, où le résultat final devrait ressembler à ceci :

ISBN      Middle Adult Count       Young Adult Count

J'ai essayé

y["Young Adult Count"] = x[(x['Age Category'] == 'Young Adult') & (y['ISBN] == x['ISBN])]['Count']

Mais cela n'a pas fonctionné

2voto

coldspeed Points 111053

groupby + sum + unstack devrait fonctionner.

df.groupby(['ISBN', 'Age Category'])\
  .Count.sum()\
  .unstack()\
  .add_suffix(' Count')

Age Category  Middle Adult Count  Young Adult Count
ISBN
000649840X                     6                 16

Si vous voulez filtrer explicitement sur ces deux catégories, alors filtrez d'abord, avec isin -

cat = ['Middle Adult', 'Young Adult']
df = df[df['Age Category'].isin(cat)]

Maintenant, effectuez le groupby .

2voto

jezrael Points 290608

Je pense que vous avez besoin pivot_table con join (jointure gauche par défaut, donc si des ISBN obtenir manquant NaN ) un autre DataFrame :

print (df1)
         ISBN  Age Category  Count
0  000649840X  Middle Adult      6
1  000649840X   Young Adult     16

print (df2)
         ISBN
0  000649840X
1  0001111111

df3 = df1.pivot_table(index='ISBN', 
                      columns='Age Category', 
                      values='Count', 
                      aggfunc='sum')
df = df2.join(df3.add_suffix(' Count'), on='ISBN')
print (df)
         ISBN  Middle Adult Count  Young Adult Count
0  000649840X                 6.0               16.0
1  0001111111                 NaN                NaN

Pour la jointure interne, utilisez le paramètre how='inner' :

df = df2.join(df3.add_suffix(' Count'), on='ISBN', how='inner')
print (df)
         ISBN  Middle Adult Count  Young Adult Count
0  000649840X                   6                 16

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