这是我保存在两个变量中的两个数据框:
> 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
我正在尝试使用以下代码合并这两个:
new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')
添加 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
但我收到此错误:
ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use 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
。见引用 here .
关于python - 尝试合并 2 个数据帧但得到 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649853/