[python] Pandas에서 merge ()와 concat ()의 차이점

사이의 근본적인 차이 (들) 무엇 pd.DataFrame.merge()pd.concat()?

지금까지 이것이 내가 찾은 것입니다. 내 이해가 얼마나 완전하고 정확한지에 대해 언급하십시오.

  • .merge()열 (행 인덱스 포함) 만 사용할 수 있으며 데이터베이스 스타일 작업에 의미 상 적합합니다. .concat()인덱스 만 사용하여 두 축과 함께 사용할 수 있으며 계층 적 인덱스를 추가하는 옵션을 제공합니다.

  • 부수적으로 이것은 다음과 같은 중복성을 허용합니다. 둘 다 행 인덱스를 사용하여 두 개의 데이터 프레임을 결합 할 수 있습니다.

  • pd.DataFrame.join() 단지 사용 사례의 하위 집합에 대한 속기를 제공합니다. .merge()

(Pandas는 데이터 분석에서 매우 광범위한 사용 사례를 처리하는 데 탁월합니다. 특정 작업을 수행하는 가장 좋은 방법이 무엇인지 파악하기 위해 문서를 탐색하는 것은 약간 어려울 수 있습니다.)



답변

매우 높은 수준의 차이점은 merge()공통 열의 값을 기반으로 두 개 (또는 그 이상의) 데이터 프레임을 결합하는 데 사용되며 (인덱스는 또한 사용, 사용 left_index=True및 / 또는 right_index=True) concat()하나 이상의 데이터 프레임을 추가하는 데 사용됩니다. 다른 아래 (또는 axis옵션이 0 또는 1로 설정 되었는지 여부에 따라 옆으로 ).

join()인덱스를 기반으로 2 개의 데이터 프레임을 병합하는 데 사용됩니다. 대신에 사용하는 merge()옵션과 함께 left_index=True우리가 사용할 수 있습니다 join().

예를 들면 :

df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})

df1:
   Key  data1
0   b   0
1   b   1
2   a   2
3   c   3
4   a   4
5   a   5
6   b   6

df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)})

df2:
    Key data2
0   a   0
1   b   1
2   d   2

#Merge
# The 2 dataframes are merged on the basis of values in column "Key" as it is 
# a common column in 2 dataframes

pd.merge(df1, df2)

   Key data1 data2
0   b    0    1
1   b    1    1
2   b    6    1
3   a    2    0
4   a    4    0
5   a    5    0

#Concat
# df2 dataframe is appended at the bottom of df1 

pd.concat([df1, df2])

   Key data1 data2
0   b   0     NaN
1   b   1     NaN
2   a   2     NaN
3   c   3     NaN
4   a   4     NaN
5   a   5     NaN
6   b   6     NaN
0   a   Nan   0
1   b   Nan   1
2   d   Nan   2


답변

pd.concat소요 Iterable인수한다. 따라서 DataFrames를 인수로 직접 사용할 수 없습니다 . 또한 Dimension의는 DataFrame연결하는 동안 축을 따라 일치해야합니다.

pd.merge취할 수있는 DataFrame인수로서들, 2 개 개의 결합하는 데 사용됩니다 DataFrame수행 할 수 없습니다 동일한 열 또는 인덱스에들 pd.concat는 DataFrame에서 반복되는 열을 표시합니다 때문이다.

조인은 DataFrame서로 다른 인덱스로 두 개의를 조인하는 데 사용할 수 있습니다 .


답변

현재와의 근본적인 차이점을 이해하려고 노력 pd.DataFrame.merge()하고 pd.concat()있습니다.

좋은 질문. 주요 차이점 :

pd.concat 두 축 모두에서 작동합니다.

다른 차이점 pd.concat내부 기본 조인 과 외부 조인 만 pd.DataFrame.merge()있고 left , right , outer , 내부 기본 조인이 있다는 것입니다.

세 번째로 주목할만한 다른 차이점은 pd.DataFrame.merge()동일한 이름의 열을 병합 할 때 열 접미사를 설정하는 옵션 pd.concat이 있지만 이는 불가능하다는 것입니다.


함께 pd.concat기본적으로 여러 dataframes (행 스택 할 수있다 axis=0)를하고 설정할 때 axis=1당신은 모방 pd.DataFrame.merge()기능을.

몇 가지 유용한 예 pd.concat:

df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe

df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end

df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's


답변

높은 수준에서 :

  • .concat()DataFrame세로로 여러 개를 함께 쌓 거나 인덱스에 정렬 한 후 가로로 스티치
  • .merge()먼저 DataFrame선택한 두 개의 공통 열 또는 인덱스를 정렬 한 다음 각 .NET의 정렬 된 행에서 나머지 열을 선택합니다 DataFrame.

보다 구체적으로 .concat():

  • 최상위 수준의 팬더 함수입니다.
  • 두 개 이상의 팬더를 DataFrame 세로 또는 가로로 결합
  • 가로로 결합 할 때 인덱스에만 정렬
  • DataFrame에 중복 색인 이 포함 된 경우 오류가 발생합니다 .
  • 내부 조인 옵션이있는 외부 조인이 기본값입니다.

그리고 .merge():

  • 최상위 수준 pandas 함수 및 DataFrame메서드 로 모두 존재합니다 (pandas 1.0 기준).
  • 정확히 두 개를 DataFrame수평으로 결합
  • 호출 DataFrame의 열 또는 색인을 다른 DataFrame열 또는 색인과
    정렬합니다.
  • 카티 전 곱을 수행 하여 조인 열 또는 인덱스의 중복 값을 처리 합니다.
  • 기본값은 왼쪽, 외부 및 오른쪽 옵션이있는 내부 결합입니다.

수행 할 때 참고 pd.merge(left, right)하면 left접합 열 또는 행 인덱스와 동일한 값을 포함하는 두 개의 행을 가지며, 각 행과 결합 윌 right‘카티 제품 결과 행을 대응이야. 반면에 .concat()열을 결합하는 데 사용되는 경우 둘 중 하나에 중복 된 인덱스가 없는지 확인해야합니다 DataFrame.

실질적으로 말하면 :

  • .concat()동종 결합시 먼저 고려하고 보완 결합시 먼저 DataFrame고려하십시오 ..merge()DataFrame
  • 수직으로 병합해야하는 경우 .concat(). 열을 통해 가로로 병합해야하는 경우 .merge()기본적으로 열을 공통으로 병합하는 로 이동 합니다.

참조 : Pandas 1.x 쿡북


답변

merge와 concat의 주요 차이점은 merge를 사용하면 concat 사용이 더 광범위하고 덜 구조화 된 테이블의 구조화 된 “조인”을 수행 할 수 있다는 것입니다.

병합

의뢰 한 문서를 , pd.DataFrame.merge바로 당신이 어떤 구조 미리 정의 된 조인 동작에 따라 왼쪽 테이블과 오른쪽 테이블에 합류로 생각 할 수있는 필수 인수로. right 매개 변수 정의에 유의하십시오 .

필수 매개 변수

  • right : DataFrame 또는 명명 된 시리즈

선택적 매개 변수

  • 방법 : { ‘left’, ‘right’, ‘outer’, ‘inner’} 기본 ‘inner’
  • on : 라벨 또는 목록
  • left_on : 레이블 또는 목록 또는 배열 유사
  • right_on : 레이블 또는 목록, 또는 배열 유사
  • left_index : bool, 기본값 False
  • right_index : bool, 기본값 False
  • sort : bool, 기본값 False
  • 접미사 : (str, str)의 튜플, 기본값 ( ‘_x’, ‘_y’)
  • copy : bool, 기본값 True
  • 표시기 : bool 또는 str, 기본값 False
  • validate : str, 선택 사항

중요 : 또는 명명 된 개체 pd.DataFrame.merge가 될 수있는 권한이 필요 합니다.pd.DataFramepd.Series

산출

  • 반환 : DataFrame

또한 pandas의 병합 작업에 대한 독 스트링을 확인하면 다음과 같습니다.

열 중 하나를 키 또는 행 인덱스로 사용하여 두 DataFrame 또는 Series 개체간에 데이터베이스 (SQL) 병합 작업을 수행합니다.

Concat

설명서 를 참조하십시오 pd.concat. 먼저 매개 변수의 이름이 table, data_frame, series, matrix 등이 아니라 objs 라는 점에 유의하십시오 . 즉, 다음과 같이 정의 된 많은 “데이터 컨테이너”를 전달할 수 있습니다.

Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]

필수 매개 변수

  • objs : Series 또는 DataFrame 객체의 시퀀스 또는 매핑

선택적 매개 변수

  • : {0 / ‘index’, 1 / ‘columns’}, 기본값 0
  • join : { ‘inner’, ‘outer’}, 기본값 ‘outer’
  • ignore_index : bool, 기본값 False
  • : 시퀀스, 기본값 없음
  • 수준 : 시퀀스 목록, 기본값 없음
  • 이름 : 목록, 기본값 없음
  • verify_integrity : bool, 기본값 False
  • sort : bool, 기본값 False
  • copy : bool, 기본값 True

산출

  • 반환 값 : 객체, 객체 유형

암호

import pandas as pd

v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])

df_left = pd.DataFrame({
    "v1": v1,
    "v2": v2,
    "v3": v3
    })
df_right = pd.DataFrame({
    "v4": [5, 5, 5, 5],
    "v5": [3, 2, 1, 0]
    })


df_concat = pd.concat([v1, v2, v3])

# Performing operations on default

merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)

코드 출력

   v1     v2  v3  v4  v5
0   1     10   0   5   3
1   5    100   1   5   2
2   9   1000   2   5   1
3  13  10000   3   5   0
====================
     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0

그러나 매개 변수 를 변경하여 concat으로 첫 번째 출력 (병합)을 얻을 수 있습니다.

concat_result = pd.concat([df_left, df_right], sort=False, axis=1)

다음 동작을 관찰하십시오.

concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)

출력;

     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0

이는 단일 DataFrame 또는 명명 된 Series 만 허용하므로 병합으로 유사한 작업을 수행 할 수 없습니다.

merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)

출력;

TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed

결론

이미 알고 계시 겠지만 입력과 출력이 “병합”과 “연결”간에 다를 수 있습니다.

처음에 언급했듯이 첫 번째 (주요) 차이점은 “병합”이 제한된 개체 및 매개 변수 집합을 사용하여보다 구조화 된 조인을 수행한다는 점입니다. 여기서 “concat”은 더 광범위한 집합과 덜 엄격하고 광범위하게 조인을 수행합니다. 개체 및 매개 변수의.

대체로 병합은 변경 / (입력)에 덜 관대하고 “연결”은 변경 / (입력)에 대해 느슨하거나 덜 민감합니다. “concat”을 사용하여 “병합”을 수행 할 수 있지만 그 반대가 항상 사실은 아닙니다.

“병합”작업은 데이터 프레임 열 (또는 pd.Series개체 이름 ) 또는 행 인덱스를 사용하며 이러한 엔터티 만 사용하기 때문에 데이터 프레임 또는 시리즈의 수평 병합을 수행하고 결과적으로 수직 작업을 적용하지 않습니다.

더 많은 것을보고 싶다면 소스 코드를 조금 더 자세히 살펴볼 수 있습니다.


답변

기본적으로 :
join은 열 방향 왼쪽 조인
pd.merge는 열 방향 내부 조인
pd.concat은 행 방향 외부 조인입니다.

pd.concat :
Iterable 인수를받습니다. 따라서 DataFrame을 직접 가져올 수 없습니다 ([df, df2] 사용).
DataFrame의 크기는 축을 따라 일치해야합니다.

Join 및 pd.merge :
DataFrame 인수를 사용할 수 있습니다.

아래 코드가 동일한 작업을 수행하는 이유를 이해하려면 그림을 클릭하십시오.

df1.join(df2)
pd.merge(df1, df2, left_index=True, right_index=True)
pd.concat([df1, df2], axis=1)


답변