2 개의 데이터 프레임을 병합하려고하지만 ValueError가 발생합니다.


85

다음은 두 개의 변수에 저장된 두 개의 데이터 프레임입니다.

> 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'는 표준 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 매개 변수와 관련이 있다고 생각합니다. 그러나 나는 그것을 저장하지 않고 고칠 생각이 없습니다.별로 중요하지 않지만 그것을 해야하는 일종의 성가심입니다.


병합 대신 조인을 사용할 때 동일한 오류가 발생했습니다.
모뎀 Rakesh goud

답변:


116

데이터 프레임 중 하나에서 연도는 문자열이고 다른 하나는 int64입니다. 먼저 변환 한 다음 결합 할 수 있습니다 (예 : df['year']=df['year'].astype(int)또는 RafaelC가 제안한대로 df.year.astype(int))

편집 : Anderson Zhu의 주석도 참고 None하십시오. 데이터 프레임 중 하나에 값 이 있거나 누락 된 경우 Int64대신 int. 여기 에서 참조를 참조 하십시오 .


감사합니다. 매년 int로 저장했기 때문에 좀 이상합니다.
PEREZje

13
왜 안돼 df.year.astype(int)?
rafaelc

나는 결국 다른 방법으로 그것을 고쳤고 모든 연도 변수를 정수로 데이터 프레임에 저장했습니다. 그들이 끈이라고 생각하지 못했습니다.
PEREZje

더 나은 아마 @RafaelC
아르 논 로템 - 갈 - 오즈

2
데이터 프레임 중 하나에 없음 또는 누락 된 값이있는 경우 Int64대신 을 사용해야 합니다 int. 여기 에서 참조를 참조 하십시오 .
Anderson Zhu

42

내 dfs에 동일한 유형 열 ( str)이 있지만에서 전환 하여 문제 joinmerge해결했습니다.


7
여기도 마찬가지입니다. 누군가가 이유를 알고 있다면 :) 아래에 적어주세요
raummensch

같은. 정말로 이상하게도, 내 유일한 추측은 모든 것이 type이라고하더라도 object조인 팬더가 데이터 유형을 한 번 더 암묵적으로 평가하려고 시도 할 때 ...하지만 병합은 나도 해결했습니다.
15Step

6
@raummensch와 @ 15Step, 나는 같은 문제가 있었다. 병합 문자열에 작동하지만 가입 이유에 대한 이유는 여기 @MatthiasFripp에 의한 대답에서 찾을 수 없습니다 : 링크를 . 기본적으로 df1.join(df2)항상 인덱스를 통해 병합 df2되지만 df1.merge(df2)열에서 병합됩니다. 그래서 기본적으로 우리는 두 열이 모두 문자열 이었지만 문자열과 정수를 기반으로 병합하려고했습니다.
Nicko aug

3

두 테이블의 공통 열이 다른 데이터 유형일 때 발생합니다.

예 : table1에서는 날짜 를 문자열로 사용하고 table2에서는 날짜 를 datetime으로 사용합니다. 따라서 병합하기 전에 날짜 를 공통 데이터 유형 으로 변경해야 합니다.


2

@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)할당이기 때문에 명시 적으로 유형을 변경합니다. 나는 이것이 컬럼의 dtype을 영구적으로 변경하는 가장 안전한 방법이라고 주장합니다.

예:

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

잡초 개체, 수량 개체


1

추가 : df를 .csv 형식으로 저장하면 datetime (이 경우 연도)이 개체로 저장되므로 병합 할 때 정수 (이 경우 연도)로 변환해야합니다. 그렇기 때문에 csv 파일에서 두 df를 모두 업로드 할 때 쉽게 병합 할 수 있지만 하나의 df가 csv 파일에서 업로드되고 다른 df가 기존 df에서 업로드되면 위의 오류가 표시됩니다. 이것은 다소 성가신 일이지만 염두에두면 쉬운 해결책이 있습니다.


0

이 간단한 솔루션이 저에게 효과적입니다.

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

그러나 먼저 중복 열을 삭제해야 할 수도 있습니다.


0

먼저 병합하려는 열 유형을 확인하십시오. 그들 중 하나는 다른 하나가있는 문자열 인 것을 볼 수 int있습니다. 그런 다음 다음 코드로 int로 변환하십시오.

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

merged = df.merge[df1, on="something"]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.