pandas
병합, 조인 및 연결
수색…
통사론
DataFrame. ( '_ x', '_y'), copy = True, merge ( right, how = 'inner', on = 없음, left_on = 없음, right_on = 없음, left_index = 거짓, right_index = 거짓, 표시기 = 거짓 )
열 또는 인덱스별로 데이터베이스 스타일의 조인 작업을 수행하여 DataFrame 개체를 병합합니다.
열의 열을 조인하면 DataFrame 인덱스가 무시됩니다. 그렇지 않으면 열 또는 열의 색인이나 색인에 색인을 결합하면 색인이 전달됩니다.
매개 변수
매개 변수 | 설명 |
---|---|
권리 | DataFrame |
방법 | { '왼쪽', '오른쪽', '외부', '내부'}, 기본 '내부' |
left_on | 레이블 또는 목록 또는 배열과 유사합니다. 왼쪽 DataFrame에서 조인 할 필드 이름입니다. 특정 벡터를 열 대신 조인 키로 사용하는 DataFrame 길이의 벡터 또는 벡터 목록이 될 수 있습니다. |
right_on | 레이블 또는 목록 또는 배열과 유사합니다. 오른쪽 DataFrame 또는 left_on 문서 당 벡터 목록에 가입 할 필드 이름 |
left_index | 부울 값, 기본값은 False입니다. 왼쪽 DataFrame의 인덱스를 조인 키로 사용하십시오. 다중 인덱스 인 경우 다른 DataFrame의 키 수 (인덱스 또는 열 수)가 레벨 수와 일치해야합니다 |
right_index | 부울 값, 기본값은 False입니다. 오른쪽 DataFrame의 인덱스를 조인 키로 사용하십시오. left_index와 동일한주의 사항 |
종류 | 부울, 기본 Fals. 결과 DataFrame에서 조인 키를 사 전적으로 정렬하십시오. |
접미사 | 2 길이 시퀀스 (튜플,리스트, ...). 왼쪽과 오른쪽에 겹치는 열 이름에 적용 할 접미어 |
부 | 부울, 기본값은 True입니다. 거짓이면 데이터를 불필요하게 복사하지 않습니다. |
지시자 | 부울 또는 문자열, 기본값은 False입니다. True이면 각 행의 소스에 대한 정보와 함께 "_merge"라는 DataFrame을 출력하는 열을 추가합니다. 문자열 인 경우 각 행의 소스에 대한 정보가있는 열이 DataFrame을 출력하기 위해 추가되며 열의 이름은 string입니다. 정보 열은 범주 형이며 병합 키가 '왼쪽'DataFrame에만 나타나는 관측치에 대해서는 'left_only'값을 취하고, '오른쪽'DataFrame에 병합 키만 나타나는 관측치에 대해서는 'right_only'를 취합니다. 관측 병합 키는 두 가지 모두에서 발견됩니다. |
병합
예를 들어, 두 개의 테이블이 주어지며,
T1
id x y
8 42 1.9
9 30 1.9
T2
id signal
8 55
8 56
8 59
9 57
9 58
9 60
목표는 새 테이블을 얻는 것입니다. T3 :
id x y s1 s2 s3
8 42 1.9 55 56 58
9 30 1.9 57 58 60
각 열에 대응하는 열 s1
, s2
및 s3
을 작성하는 것입니다 ( id
당 행 수는 항상 고정되어 3입니다)
join
(선택 사항 인 인수를 취함)은 전달 된 DataFrame이 DataFrame의 해당 열에 정렬되도록 지정하는 열 또는 여러 열 이름 일 수 있습니다. 그래서 해결책은 아래와 같습니다 :
unstack (). reset_index ()) df = df1.merge (df2.groupby ( 'id') [ 'signal'] 적용됩니다 (lambda x : x.reset_index (drop = True)).
df
Out[63]:
id x y 0 1 2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
내가 그들을 분리하면 :
df2t = df2.groupby('id')['signal'].apply(lambda x: x.reset_index(drop=True)).unstack().reset_index()
df2t
Out[59]:
id 0 1 2
0 8 55 56 59
1 9 57 58 60
df = df1.merge(df2t)
df
Out[61]:
id x y 0 1 2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
두 개의 DataFrames 병합
In [1]: df1 = pd.DataFrame({'x': [1, 2, 3], 'y': ['a', 'b', 'c']})
In [2]: df2 = pd.DataFrame({'y': ['b', 'c', 'd'], 'z': [4, 5, 6]})
In [3]: df1
Out[3]:
x y
0 1 a
1 2 b
2 3 c
In [4]: df2
Out[4]:
y z
0 b 4
1 c 5
2 d 6
내부 조인 :
두 개의 DataFrames에서 키의 교차를 사용합니다.
In [5]: df1.merge(df2) # by default, it does an inner join on the common column(s)
Out[5]:
x y z
0 2 b 4
1 3 c 5
또는 두 개의 데이터 프레임에서 키의 교차를 지정하십시오.
In [5]: merged_inner = pd.merge(left=df1, right=df2, left_on='y', right_on='y')
Out[5]:
x y z
0 2 b 4
1 3 c 5
외부 조인 :
두 개의 DataFrames에서 키 조합을 사용합니다.
In [6]: df1.merge(df2, how='outer')
Out[6]:
x y z
0 1.0 a NaN
1 2.0 b 4.0
2 3.0 c 5.0
3 NaN d 6.0
왼쪽 가입 :
왼쪽 DataFrame의 키만 사용합니다.
In [7]: df1.merge(df2, how='left')
Out[7]:
x y z
0 1 a NaN
1 2 b 4.0
2 3 c 5.0
오른쪽 가입
올바른 DataFrame의 키만 사용합니다.
In [8]: df1.merge(df2, how='right')
Out[8]:
x y z
0 2.0 b 4
1 3.0 c 5
2 NaN d 6
여러 데이터 프레임 병합 / 연결 / 결합 (가로 및 세로)
샘플 데이터 프레임 생성 :
In [57]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})
In [58]: df1 = pd.DataFrame({'col1':[11,12,13], 'col2': [21,22,23]})
In [59]: df2 = pd.DataFrame({'col1':[111,112,113], 'col2': [121,122,123]})
In [60]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})
In [61]: df1
Out[61]:
col1 col2
0 11 21
1 12 22
2 13 23
In [62]: df2
Out[62]:
col1 col2
0 111 121
1 112 122
2 113 123
In [63]: df3
Out[63]:
col1 col2
0 211 221
1 212 222
2 213 223
데이터 프레임 [df1, df2, df3] 병합 / 결합 / 결합 - 세로줄 추가 - 행 추가
In [64]: pd.concat([df1,df2,df3], ignore_index=True)
Out[64]:
col1 col2
0 11 21
1 12 22
2 13 23
3 111 121
4 112 122
5 113 123
6 211 221
7 212 222
8 213 223
데이터 프레임을 수평으로 병합 / 조인 / 연결합니다 (인덱스별로 정렬).
In [65]: pd.concat([df1,df2,df3], axis=1)
Out[65]:
col1 col2 col1 col2 col1 col2
0 11 21 111 121 211 221
1 12 22 112 122 212 222
2 13 23 113 123 213 223
병합, 결합 및 결합
키 이름 병합은 동일합니다.
pd.merge(df1, df2, on='key')
키 이름 병합이 다릅니다.
pd.merge(df1, df2, left_on='l_key', right_on='r_key')
다양한 유형의 합류
pd.merge(df1, df2, on='key', how='left')
여러 키에 병합
pd.merge(df1, df2, on=['key1', 'key2'])
겹치는 열 처리
pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
병합하는 키 대신 행 인덱스 사용
pd.merge(df1, df2, right_index=True, left_index=True)
겹쳐진 열을 제외하고는 .join
구문을 사용하지 마십시오.
왼쪽 데이터 프레임 인덱스 및 오른쪽 데이터 프레임 열에 병합
pd.merge(df1, df2, right_index=True, left_on='l_key')
연속 데이터 프레임
수직으로 붙임
pd.concat([df1, df2, df3], axis=0)
수평으로 붙임
pd.concat([df1, df2, df3], axis=1)
조인과 병합의 차이점은 무엇입니까?
left
과 right
데이터 프레임을 고려하십시오.
left = pd.DataFrame([['a', 1], ['b', 2]], list('XY'), list('AB'))
left
A B
X a 1
Y b 2
right = pd.DataFrame([['a', 3], ['b', 4]], list('XY'), list('AC'))
right
A C
X a 3
Y b 4
join
join
은 각각의 인덱스를 기반으로 데이터 프레임과 결합하려는 것으로 생각하십시오. 겹치는 열이 있으면 join
은 왼쪽 데이터 프레임에서 겹치는 열 이름에 접미사를 추가 join
를 원할 것입니다. 두 개의 데이터 프레임에는 겹치는 열 이름 A
있습니다.
left.join(right, lsuffix='_')
A_ B A C
X a 1 a 3
Y b 2 b 4
색인이 보존되어 있고 우리는 4 개의 열을 가지고 있습니다. 2에서 열 left
과 2 right
.
인덱스가 정렬되지 않은 경우
left.join(right.reset_index(), lsuffix='_', how='outer')
A_ B index A C
0 NaN NaN X a 3.0
1 NaN NaN Y b 4.0
X a 1.0 NaN NaN NaN
Y b 2.0 NaN NaN NaN
요점을 더 잘 설명하기 위해 외부 조인을 사용했습니다. 인덱스가 정렬되지 않으면 결과는 인덱스의 합집합이됩니다.
join
에 왼쪽 데이터 프레임의 특정 열을 사용하여 조인 키로 사용할 수 있지만 여전히 오른쪽에서 인덱스를 사용합니다.
left.reset_index().join(right, on='index', lsuffix='_')
index A_ B A C
0 X a 1 a 3
1 Y b 2 b 4
merge
merge
은 열 정렬로 생각하십시오. 기본적으로 merge
은 merge
할 겹치는 열을 찾습니다. merge
은 사용자가 매개 변수 on
과 함께 사용할 겹치는 열의 하위 집합을 지정하거나 병합 할 오른쪽의 왼쪽 열과 어떤 열을 지정하도록 허용하여 병합 키를보다 잘 제어 할 수 있습니다.
merge
은 인덱스가 파괴되는 결합 된 데이터 프레임을 반환합니다.
이 간단한 예제는 겹치는 열이 'A'
가되도록 찾아서 결합합니다.
left.merge(right)
A B C
0 a 1 3
1 b 2 4
색인은 [0, 1]
이며 더 이상 ['X', 'Y']
아닙니다 ['X', 'Y']
left_index
또는 right_index
매개 변수를 사용하여 인덱스에 병합하도록 명시 적으로 지정할 수 있습니다
left.merge(right, left_index=True, right_index=True, suffixes=['_', ''])
A_ B A C
X a 1 a 3
Y b 2 b 4
그리고 위의 join
예제와 정확히 같습니다.