这是我保存在两个变量中的两个数据帧:
> 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参数有关。但是我没有办法在不保存它的情况下修复它,这并不重要,但我不得不这样做是一种恼人的事情。
发布于 2018-06-02 03:27:43
在您的一个数据帧中,年份是一个字符串,另一个是int64,您可以先转换它,然后连接(例如,df['year']=df['year'].astype(int)
或RafaelC建议的df.year.astype(int)
)
编辑:还请注意Anderson Zhu的评论:以防您的某个数据帧中有None
或缺少值,您需要使用Int64
而不是int
。请参见参考here。
发布于 2020-03-04 05:46:17
我发现我的dfs具有相同类型的列(str
),但是从join
切换到merge
解决了这个问题。
发布于 2020-01-10 00:10:07
@Arnon Rotem-Gal-Oz的答案大部分是正确的。但我想指出df['year']=df['year'].astype(int)
和df.year.astype(int)
之间的区别。df.year.astype(int)
返回数据帧的视图,并且不会显式更改类型,至少在pandas 0.24.2中是这样。df['year']=df['year'].astype(int)
显式地更改了类型,因为它是赋值。我认为这是永久更改列的数据类型的最安全的方法。
示例:
df = pd.DataFrame({'Weed': ['green crack', 'northern lights', 'girl scout cookies'], 'Qty':[10,15,3]}) df.dtypes
杂草对象,数量int64
df['Qty'].astype(str) df.dtypes
杂草对象,数量int64
即使将inplace arg设置为True有时也无济于事。我不知道为什么会发生这种情况。在大多数情况下,inplace=True等于显式赋值。
df['Qty'].astype(str, inplace = True) df.dtypes
杂草对象,数量int64
现在任务是,
df['Qty'] = df['Qty'].astype(str) df.dtypes
杂草对象、数量对象
https://stackoverflow.com/questions/50649853
复制相似问题