首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正在尝试合并2个数据帧,但获取ValueError

正在尝试合并2个数据帧,但获取ValueError
EN

Stack Overflow用户
提问于 2018-06-02 03:20:07
回答 8查看 233.5K关注 0票数 114

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

代码语言:javascript
复制
> 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

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

代码语言:javascript
复制
new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')

添加how='left‘是因为我的ranking_df中的数据点少于我的标准df中的数据点。

预期行为如下:

代码语言:javascript
复制
> 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加载到数据帧中,我的代码就可以工作。

代码如下:

代码语言:javascript
复制
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参数有关。但是我没有办法在不保存它的情况下修复它,这并不重要,但我不得不这样做是一种恼人的事情。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-06-02 03:27:43

在您的一个数据帧中,年份是一个字符串,另一个是int64,您可以先转换它,然后连接(例如,df['year']=df['year'].astype(int)或RafaelC建议的df.year.astype(int))

编辑:还请注意Anderson Zhu的评论:以防您的某个数据帧中有None或缺少值,您需要使用Int64而不是int。请参见参考here

票数 145
EN

Stack Overflow用户

发布于 2020-03-04 05:46:17

我发现我的dfs具有相同类型的列(str),但是从join切换到merge解决了这个问题。

票数 79
EN

Stack Overflow用户

发布于 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

杂草对象、数量对象

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50649853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档