안녕, 나는 다음과 같은 데이터 프레임이 있습니다
> 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”라는 새로운 열로 옮길 수 있습니까?
감사
답변
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
답변
인덱스로 정렬 된 둘 이상의 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)
답변
기본적으로 :
join
열 단위의 왼쪽 조인
pd.merge
은 열 단위의 내부 조인
pd.concat
은 행 단위의 외부 조인입니다
pd.concat
:
반복 가능한 인수를 취합니다. 따라서 DataFrame을 직접 사용할 수 없습니다 (사용 [df,df2]
)
DataFrame의 크기는 축을 따라 일치해야합니다
Join
및 pd.merge
:
DataFrame 인수를 사용할 수 있습니다
답변
어리석은 버그 : 인덱스가 dtypes
다르기 때문에 조인이 실패했습니다 . 두 테이블이 모두 동일한 원래 테이블의 피벗 테이블이기 때문에 이것은 분명하지 않았습니다. 이후 reset_index
Jupyter에서 지수는 동일하게 보였습니다. Excel에 저장할 때만 조명이 켜졌습니다 …
로 고정 : df1[['key']] = df1[['key']].apply(pd.to_numeric)
잘만되면 이것은 1 시간의 누군가를 구한다!
답변
팬더에서 두 개의 데이터 프레임을 결합하려면 merge
또는 과 같은 사용 가능한 속성을 간단히 사용할 수 있습니다 concatenate
. 예를 들어 데이터 프레임이 두 개인 경우 다음 df1
과 df2
같이 결합 할 수 있습니다.
newdataframe=merge(df1,df2,left_index=True,right_index=True)