尝试合并2个数据帧但得到ValueError

PER*_*Zje 43 python dataframe pandas

这些是我的两个数据框保存在两个变量中:

> 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
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下代码合并这两个:

new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')
Run Code Online (Sandbox Code Playgroud)

添加了how ='left',因为我的ranking_df中的数据点数少于标准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
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

ValueError:您正在尝试合并object和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')
Run Code Online (Sandbox Code Playgroud)

我认为它与index_col = 0参数有关.但我不知道如何解决它而不必保存它,它没有多大关系,但是我必须这样做是一种烦恼.

Arn*_*-Oz 73

在您的一个数据框中,年份是一个字符串,另一个是int64,您可以先将其转换然后加入(例如,df['year']=df['year'].astype(int)或者如RafaelC建议的那样df.year.astype(int))

  • 为什么不``df.year.astype(int)`? (12认同)
  • 万一您的数据帧中没有值或缺少值,则需要使用“Int64”而不是“int”。请参阅[此处](https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html)的参考。 (3认同)

Ale*_*emi 65

我发现我的 dfs 都有相同类型的列 ( str) 但从 切换joinmerge解决了这个问题。

  • @raummensch 和@15Step,我也遇到了同样的问题。为什么合并适用于字符串但联接不适用于此处的 @MatthiasFripp 的答案:[链接](/sf/ask/1587325701/ Between-加入并合并熊猫)。基本上 ```df1.join(df2)``` 总是通过 ```df2``` 的索引合并,而 ```df1.merge(df2)``` 将在列上合并。所以基本上我们试图基于字符串和整数进行合并,即使两列都是字符串。 (14认同)
  • 同样在这里。如果有人知道为什么,请写在下面:) (11认同)
  • 每六个月我都会在忘记这个技巧后找到回到这个答案的方法,哈哈,谢谢亚历克斯! (3认同)
  • 相同的。确实很奇怪,我唯一的猜测是,即使所有内容都是“object”类型,在进行连接时,pandas 也会尝试再次隐式地评估数据类型......但是合并也为我解决了这个问题。 (2认同)

Ash*_*and 6

当两个表中的公共列具有不同的数据类型时,就会发生这种情况。

示例:在 table1 中,日期字符串,而在 table2 中,日期日期时间。所以在合并之前,我们需要将日期更改为通用数据类型。