두 개의 데이터 프레임을 병합하려고 하지만 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'가 추가된 이유는 제가 제 표준 df보다 제 ranking_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
하지만 다음과 같은 오류가 발생합니다.
값 오류:개체와 int64 열에서 병합하려고 합니다.계속 진행하려면 pd.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)
또는 Rafael C가 제안한 대로df.year.astype(int)
)
편집: Anderson Zhu의 의견도 참고하세요: 만약을 위해.None
데이터 프레임 중 하나에서 값이 누락된 경우 사용해야 합니다.Int64
대신에int
여기 참조를 참조하십시오.
나는 내 dfs 둘 다 같은 유형의 열을 가지고 있다는 것을 발견했습니다.str
) 그러나 전환join
로.merge
문제를 해결했습니다.
두 표의 공통 열이 서로 다른 데이터 유형일 때 발생합니다.
예:표 1에서는 날짜를 문자열로 지정한 반면, 표 2에서는 날짜를 날짜 시간으로 지정합니다.그래서 병합하기 전에 날짜를 공통 데이터 유형으로 변경해야 합니다.
@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': ['green crack', 'northern lights', 'girl scout cookies'], 'Qty':[10,15,3]}) df.dtypes
잡초 개체, Qty int64
df['Qty'].astype(str) df.dtypes
잡초 개체, Qty int64
inplace arg를 True로 설정해도 도움이 되지 않는 경우가 있습니다.그런데 왜 이런 일이 생기는지 모르겠어요.대부분의 경우 제자리 =True는 명시적 할당과 같습니다.
df['Qty'].astype(str, inplace = True) df.dtypes
잡초 개체, Qty int64
이제 과제는
df['Qty'] = df['Qty'].astype(str) df.dtypes
잡초 개체, Qty 개체
먼저 병합할 열의 유형을 확인합니다.당신은 그들 중 하나가 다른 하나가 있는 문자열이라는 것을 보게 될 것입니다.int
그런 다음 다음 다음 코드로 int로 변환합니다.
df["something"] = df["something"].astype(int)
merged = df.merge[df1, on="something"]
이 경우 인덱스가 아닌 열을 병합하려고 했기 때문에 이 문제를 해결하기 위해 설명서에서 찾은 다음 코드를 사용했습니다.
df.set_index('key').join(other.set_index('key'))
설명서: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html 키를 인덱스로 설정합니다.
추가: df를 .csv 형식으로 저장하면 날짜 시간(이 경우 연도)이 개체로 저장되므로 병합할 때 정수(이 경우 연도)로 변환해야 합니다.그렇기 때문에 csv 파일에서 두 df를 업로드할 때 병합을 쉽게 할 수 있지만, 하나는 csv 파일에서 업로드되고 다른 하나는 기존 df에서 업로드되면 위의 오류가 나타납니다.이것은 다소 귀찮은 일이지만, 염두에 둔다면 쉬운 해결책을 생각해 보세요.
이 간단한 해결책은 저에게 효과가 있습니다.
final = pd.concat([df, rankingdf], axis=1, sort=False)
그러나 먼저 중복 열을 삭제해야 할 수도 있습니다.
파일 2: 왜 제가 그것을 알 수 . 왜냐하면 저는 을 할 때 그것을 받았기 때문입니다. 왜냐하면 할 때data.head()
▁same에서 정확히 같은 .ds
(시간 열).
추가할 때 오류가 수정되었습니다.parse_dates
에 시대에pd.read_csv()
방법:
data = pd.read_csv(('source.csv'), sep=';', parse_dates=['Date'], encoding= 'unicode_escape')
언급URL : https://stackoverflow.com/questions/50649853/trying-to-merge-2-dataframes-but-get-valueerror
'programing' 카테고리의 다른 글
Python을 사용하여 기존 PDF에 텍스트 추가 (0) | 2023.07.20 |
---|---|
파이썬의 요청 모듈을 사용하여 웹 사이트에 "로그인"하는 방법은 무엇입니까? (0) | 2023.07.20 |
Python range()와 유사한 JavaScript 함수 (0) | 2023.07.20 |
일별로 레코드를 새로 고치는 구체화된 보기 (0) | 2023.07.20 |
Oracle SQL의 루프의 경우 (0) | 2023.07.20 |