Ответ 1
В одном из ваших фреймов данных год - это строка, а в другом - int64, вы можете сначала преобразовать его, а затем присоединить (например, df['year']=df['year'].astype(int)
или, как RafaelC предложил df.year.astype(int)
)
Это мои два кадра данных, сохраненные в двух переменных:
> 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, а затем загружу этот .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)
)
Это происходит, когда общие столбцы в обеих таблицах имеют разные типы данных.
Пример: в таблице 1 у вас есть дата в виде строки, тогда как в таблице 2 у вас есть дата как дата и время. поэтому перед объединением нам нужно изменить дату на общий тип данных.
Дополнительно: когда вы сохраняете df в формате .csv, дата-время (год в данном конкретном случае) сохраняется как объект, поэтому вам нужно преобразовать его в целое число (год в данном конкретном случае), когда вы выполняете слияние. Вот почему, когда вы загружаете оба df из файлов csv, вы можете легко выполнить слияние, в то время как вышеупомянутая ошибка будет отображаться, если один df загружен из файлов csv, а другой - из существующего df. Это несколько раздражает, но есть простое решение, если иметь в виду.