99 votes

Essayer de fusionner 2 cadres de données mais obtenir ValueError

Ce sont mes deux dataframes enregistrées dans deux variables:

> print(df.head())
>
          club_name  tr_jan  tr_dec  year
    0  ADO Den Haag    1368    1422  2010
    1  ADO Den Haag    1455    1477  2011
    2  ADO Den Haag    1461    1443  2012
    3  ADO Den Haag    1437    1383  2013
    4  ADO Den Haag    1386    1422  2014
> print(rankingdf.head())
>
           club_name  ranking  year
    0    ADO Den Haag    12    2010
    1    ADO Den Haag    13    2011
    2    ADO Den Haag    11    2012
    3    ADO Den Haag    14    2013
    4    ADO Den Haag    17    2014

Je suis en train de fusionner ces deux à l'aide de ce code:

new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')

Le comment= "gauche" est ajouté car j'ai moins de points de données dans mon ranking_df que dans mon standard df.

Le comportement attendu est comme suit:

> print(new_df.head()) 
> 

      club_name  tr_jan  tr_dec  year    ranking
0  ADO Den Haag    1368    1422  2010    12
1  ADO Den Haag    1455    1477  2011    13
2  ADO Den Haag    1461    1443  2012    11
3  ADO Den Haag    1437    1383  2013    14
4  ADO Den Haag    1386    1422  2014    17

Mais j'ai cette erreur:

ValueError: Vous essayez de fusionner sur l'objet et le int64 colonnes. Si vous souhaitez poursuivre, vous devez utiliser la mp.concat

Mais je ne souhaite pas utiliser concat depuis que je veux fusionner les arbres qui ne sont pas simplement les ajouter sur.

Un autre comportement qui est bizarre dans mon esprit, c'est que mon code fonctionne si je l'enregistrement de la première df pour .csv et ensuite charger ce .csv dans un dataframe.

Le code pour que:

df = pd.DataFrame(data_points, columns=['club_name', 'tr_jan', 'tr_dec', 'year'])
df.to_csv('preliminary.csv')

df = pd.read_csv('preliminary.csv', index_col=0)

ranking_df = pd.DataFrame(rankings, columns=['club_name', 'ranking', 'year'])

new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')

Je pense que cela a à voir avec la index_col=0 paramètre. Mais je n'ai aucune idée de le fixer sans avoir à l'enregistrer, il n'importe pas bien, mais c'est le genre de désagrément que j'ai à faire.

133voto

Arnon Rotem-Gal-Oz Points 8055

Dans l'un de vos cadres de données, l'année est une chaîne et l'autre c'est un int64, vous pouvez le convertir d'abord, puis le rejoindre (par exemple df['year']=df['year'].astype(int) ou comme RafaelC l'a suggéré df.year.astype(int) )

4voto

escha Points 47

@Arnon Rotem-Gal-Oz réponse est juste, pour la plupart. Mais je tiens à souligner la différence entre df['year']=df['year'].astype(int) et df.year.astype(int). df.year.astype(int) renvoie une vue de la dataframe et ne modifiez pas explicitement le type, au moins dans les pandas 0.24.2. df['year']=df['year'].astype(int) modifier explicitement le type parce que c'est une affectation. Je dirais que c'est le plus sûr moyen de changer de façon permanente la dtype d'une colonne.

Exemple:

df = pd.DataFrame({'Weed': ['green crack', 'northern lights', 'girl scout cookies'], 'Qty':[10,15,3]}) df.dtypes

Mauvaises herbes objet, Qté int64

df['Qty'].astype(str) df.dtypes

Mauvaises herbes objet, Qté int64

Même en mettant la place arg à Vrai n'aide pas à la fois. Je ne sais pas pourquoi qui se passe si. Dans la plupart des cas inplace=True correspond à une affectation explicite.

df['Qty'].astype(str, inplace = True) df.dtypes

Mauvaises herbes objet, Qté int64

Maintenant, la cession,

df['Qty'] = df['Qty'].astype(str) df.dtypes

Mauvaises herbes objet, Qté objet

3voto

Ashish Anand Points 1

Cela se produit lorsque la colonne commune dans les deux tables est de type de données différent.

Exemple: dans table1, vous avez la date sous forme de chaîne alors que dans la table2, vous avez la date sous forme de date / heure . donc avant de fusionner, nous devons changer la date en type de données commun.

1voto

CathyQian Points 90

Supplémentaire: lorsque vous enregistrez df au format .csv, le datetime (année dans ce cas spécifique) est enregistré en tant qu'objet, vous devez donc le convertir en entier (année dans ce cas spécifique) lorsque vous effectuez la fusion. C'est pourquoi lorsque vous téléchargez les deux df à partir de fichiers csv, vous pouvez faire la fusion facilement, tandis que l'erreur ci-dessus apparaîtra si un df est téléchargé à partir de fichiers csv et l'autre à partir d'un df existant. C'est quelque peu ennuyeux, mais ayez une solution facile si vous la gardez à l'esprit.

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