두 개의 데이터 프레임을 인덱스로 병합


160

안녕, 나는 다음과 같은 데이터 프레임이 있습니다

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

인덱스를 어떻게 병합하여 얻을 수 있습니까?

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

나의 이해 때문에 나는 물어 merge()df1.merge(df2)매칭을 수행하는 열을 사용합니다. 사실, 이렇게하면 :

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

인덱스를 병합하는 것은 나쁜 습관입니까? 불가능합니까? 그렇다면 어떻게 색인을 "index"라는 새로운 열로 옮길 수 있습니까?

감사


3
df1.join(df2)
MaxU

한 데이터 프레임의 인덱스와 두 번째 데이터 프레임의 열로 조인하려면 어떻게해야합니까? (두 번째 데이터 프레임에는 첫 번째 문서의 색인과 일치하는 열이 있습니다.)
mikey

답변:


321

merge기본적으로 내부 조인 인을 사용하십시오 .

pd.merge(df1, df2, left_index=True, right_index=True)

또는 join기본적으로 결합 된 상태입니다.

df1.join(df2)

또는 concat기본적으로 외부 조인입니다.

pd.concat([df1, df2], axis=1)

샘플 :

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

2
좋은. 다른 사람이이 글을 읽는 것이 작동하지 않는 경우에 당신이 필요로하는 경우, 참조 .transpose()내 문제였다 - 인덱스까지 동기화하기 위해 DFS의 한
요나

2
고마워 좋은 대답입니다. 그런데 왜 않는 concat동안 괄호 안에 DF 넣어해야 join하고 merge하지?
Bowen Liu

같은 목록에서 가능한 CONCAT을 여러 DataFrames에 대한 제 생각에는 @Bowen 리우 dfs = [df1, df2, df3,... dfn]다음df = pd. concat(dfs)
jezrael


29

인덱스로 정렬 된 둘 이상의 DF를 연결하기 위해 concat ([df1, df2, ...], axis = 1) 을 사용할 수 있습니다 .

pd.concat([df1, df2, df3, ...], axis=1)

또는 사용자 정의 필드 / 색인으로 연결 하기 위해 병합하십시오.

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

또는 인덱스로 조인 하기위한 조인 :

 df1.join(df2)

6

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

pd.concat:
반복 가능한 인수를 취합니다. 따라서 DataFrame을 직접 사용할 수 없습니다 (사용 [df,df2])
DataFrame의 크기는 축을 따라 일치해야합니다

Joinpd.merge:
DataFrame 인수를 사용할 수 있습니다


5

어리석은 버그 : 인덱스가 dtypes다르기 때문에 조인이 실패했습니다 . 두 테이블이 모두 동일한 원래 테이블의 피벗 테이블이기 때문에 이것은 분명하지 않았습니다. 이후 reset_indexJupyter에서 지수는 동일하게 보였습니다. Excel에 저장할 때만 조명이 켜졌습니다 ...

로 고정 : df1[['key']] = df1[['key']].apply(pd.to_numeric)

잘만되면 이것은 1 시간의 누군가를 구한다!


4

팬더에서 두 개의 데이터 프레임을 결합하려면 merge또는 과 같은 사용 가능한 속성을 간단히 사용할 수 있습니다 concatenate. 예를 들어 데이터 프레임이 두 개인 경우 다음 df1df2같이 결합 할 수 있습니다.

newdataframe=merge(df1,df2,left_index=True,right_index=True)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.