尝试合并2个数据帧但获取值

2024-06-12 07:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

> 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'是因为我的排名数据点比标准数据点少。

预期行为如下:

> 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参数有关。但我不知道不需要保存就可以修复它,这不重要,但我不得不这么做有点烦人。


Tags: csv数据namedfyearheadtrjan
3条回答

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

示例:在表1中,您有日期作为字符串,而在表2中,您有日期作为日期时间。因此在合并之前,我们需要将日期更改为通用数据类型。

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

附加:将df保存为.csv格式时,日期时间(本例中为年份)将保存为对象,因此在进行合并时需要将其转换为整数(本例中为年份)。这就是为什么当您从csv文件上传两个df时,您可以轻松地进行合并,而如果一个df是从csv文件上传的,而另一个是从现有df上传的,则会显示上述错误。这有点烦人,但有一个简单的解决办法,如果记住。

相关问题 更多 >