这是我保存在两个变量中的两个数据框:
> 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:您正在尝试合并 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')
我认为这与 index_col=0 参数有关。但我不知道如何在不保存的情况下修复它,这没什么大不了的,但我不得不这么做,这有点烦人。
在您的一个数据框中,年份是一个字符串,另一个数据框是一个 int64,您可以先将其转换,然后连接(例如df['year']=df['year'].astype(int)或按照 RafaelC 建议的df.year.astype(int))
df['year']=df['year'].astype(int)
df.year.astype(int)
编辑:还请注意 Anderson Zhu 的评论:万一您None的某个数据框中有或缺少值,则需要使用Int64而不是。请参阅此处的int参考。
None
Int64
int