1. ホーム
  2. python

[解決済み] 2つのデータフレームをマージしようとすると、ValueErrorが発生します。

2022-05-15 04:11:43

質問

2つの変数に保存されている私の2つのデータフレームです。

> 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

このコードを使って、この2つを結合しようとしています。

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

how='left'は、標準のdfよりもranking_dfの方がデータポイントが少ないので追加したものです。

期待される動作はこのようなものです。

> 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

でも、こんなエラーが出ます。

ValueErrorです。オブジェクトとint64カラムをマージしようとしています。もし pd.concat を使用してください。

しかし、私はツリーを追加するだけでなく、マージしたいので、concatは使用したくありません。

私の心の中で奇妙なもう一つの動作は、最初のdfを.csvに保存し、その.csvをデータフレームにロードすると、私のコードが動作することです。

そのためのコードです。

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')

私はそれがindex_col=0パラメータに関係していると思います。しかし、私はそれを保存することなく修正するアイデアがありません、それはあまり重要ではありませんが、私がそれをしなければならないのは一種の迷惑です。

どのように解決するのですか?

データフレームの一方では年は文字列で、もう一方ではint64です。 である場合、最初にそれを変換してから結合することができます (例. df['year']=df['year'].astype(int) またはRafaelCが提案したように df.year.astype(int) )

編集部:Anderson Zhu氏のコメントにも注目です。念のため、あなたが None がある場合、あるいはデータフレームのひとつに値がない場合は Int64 の代わりに int . 参照 ここで .