尝试合并两个数据框架,但得到 ValueError

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

> 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’是因为在 rank _ 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: 您正试图合并对象和 int64列。如果 您希望继续,应该使用 pd.concat

但是我不希望使用 concat,因为我想合并树,而不仅仅是添加它们。

在我看来,另一个奇怪的行为是,如果我将第一个 df 保存到。然后加载它。将 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参数有关。但是我不知道如何在不保存它的情况下修复它,这并不重要,但是我不得不这样做,这有点烦人。

316122 次浏览

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

编辑: 还要注意 Anderson Zhu 的评论: 为了防止您的数据框架中有 None或缺少值,您需要使用 Int64而不是 int。请参阅参考资料 给你

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

例如: 在表1中,约会作为字符串,而在表2中,约会作为日期时间。因此在合并之前,我们需要将 约会更改为公共数据类型。

附加: 将 df 保存到。Csv 格式,datetime (在这个特定的情况下是 year)被保存为对象,因此在进行合并时需要将其转换为整数(在这个特定的情况下是 year)。这就是为什么从 csv 文件上传两个 df 时,可以很容易地进行合并,而如果一个 df 是从 csv 文件上传的,另一个是从现有 df 上传的,则会显示上述错误。这有点烦人,但是如果牢记在心,有一个简单的解决方案。

@ Arnon Rotem-Gal-Oz 的回答大部分是正确的。但是我想指出 df['year']=df['year'].astype(int)df.year.astype(int)之间的区别。df.year.astype(int)返回数据框的一个视图,并且没有显式地更改类型,至少在熊猫0.24.2中是这样。df['year']=df['year'].astype(int)显式更改类型,因为它是赋值。我认为这是永久更改列的 dtype 的最安全的方法。

例如:

Df = pd. DataFrame ({‘ Weed’: [“绿色裂缝”,“北极光”,“女童子军” Cookies’] ,‘ Qty’: [10,15,3]}) Dtype

杂草物体, Qty int64

Df [‘ Qty’] . astype (str) Dtype

杂草物体, Qty int64

即使将 inplace 参数设置为 True 有时也没有帮助,我不知道为什么会这样 在大多数情况下,inplace = True 等于一个显式的赋值。

Df [‘ Qty’] . astype (str,inplace = True) Dtype

杂草物体, Qty int64

现在作业,

Df [‘ Qty’] = df [‘ Qty’] . astype (str) Dtype

杂草物体, 数量众多的物品

首先检查要合并的列的类型。你会看到其中一个是字符串,另一个是 int。然后将其转换为如下代码:

df["something"] = df["something"].astype(int)


merged = df.merge[df1, on="something"]

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

这个简单的方法对我有用

    final = pd.concat([df, rankingdf], axis=1, sort=False)

但是您可能需要先删除一些重复的列。

在我的例子中,发生这种情况是因为我试图合并那些没有索引的列,所以为了解决这个问题,我使用了我在文档中找到的这段代码:

df.set_index('key').join(other.set_index('key'))

文件: Https://pandas.pydata.org/docs/reference/api/pandas 将键设置为索引