두 개의 데이터 프레임을 병합하고 이름으로 열 수준 추가


9

안녕하세요, 팬더를위한 concat, join 및 merge 메소드를 파고 있었고 원하는 것을 찾지 못하는 것 같습니다.

두 개의 데이터 프레임이 있다고 가정 해 봅시다.

A = pd.DataFrame("A",index=[0,1,2,3,4],columns=['Col 1','Col 2','Col 3'])
B = pd.DataFrame("B",index=[0,1,2,3,4],columns=['Col 1','Col 2','Col 3'])
>>> A
  Col 1 Col 2 Col 3
0     A     A     A
1     A     A     A
2     A     A     A
3     A     A     A
4     A     A     A
>>> B
  Col 1 Col 2 Col 3
0     B     B     B
1     B     B     B
2     B     B     B
3     B     B     B
4     B     B     B

이제 열을 병합하여 새 데이터 프레임을 만들고 싶습니다. 열을 원하는 방법에 대한 다중 인덱스를 만드는지 설명하는 것이 가장 쉽다고 생각합니다.

index = pd.MultiIndex.from_product([A.columns.values,['A','B']])
>>> index
MultiIndex(levels=[['Col 1', 'Col 2', 'Col 3'], ['A', 'B']],
           labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])

이제 열에 대한이 다중 색인으로 빈 데이터 프레임을 만들면

empty_df = pd.DataFrame('-',index=A.index,columns=index)
>>> empty_df
  Col 1    Col 2    Col 3
      A  B     A  B     A  B
0     -  -     -  -     -  -
1     -  -     -  -     -  -
2     -  -     -  -     -  -
3     -  -     -  -     -  -
4     -  -     -  -     -  -

내 질문은, 그것을 얻기 위해 어떤 병합, 연결 또는 결합을 사용합니까? 나는 내부, 외부 등 여러 가지를 시도했다. 내가 원하는 것을 찾을 수없는 것 같다. 내가 생각할 수있는 유일한 것은 빈 데이터 프레임을 만든 다음 다시 채우는 것입니다.

편집 : Jezrael의 응답을 시도한 후에는 가깝지만 정확하지는 않습니다. 내가 원하는 것은 정렬 된 열과 같습니다. 예를 들어

empty_df['Col 1']
>>> empty_df['Col 1']
   A  B
0  -  -
1  -  -
2  -  -
3  -  -
4  -  -

또는

>>> empty_df['Col 1']['A']
0    -
1    -
2    -
3    -
4    -
Name: A, dtype: object

그래서 이것은 내가 생각해 냈지만 열을 반복하는 해결책입니다.

row_idx = A.index.union(B.index)
col_idx = pd.MultiIndex.from_product([A.columns.values,['A','B']])
new_df = pd.DataFrame('-',index=row_idx,columns=col_idx)
for column in A.columns:
   new_df.loc[:,(column,'A')] = A[column]
   new_df.loc[:,(column,'B')] = B[column]
>>> new_df
  Col 1    Col 2    Col 3
      A  B     A  B     A  B
0     A  B     A  B     A  B
1     A  B     A  B     A  B
2     A  B     A  B     A  B
3     A  B     A  B     A  B
4     A  B     A  B     A  B
>>> new_df['Col 1']
   A  B
0  A  B
1  A  B
2  A  B
3  A  B
4  A  B
>>> new_df['Col 1']['A']
0    A
1    A
2    A
3    A
4    A
Name: A, dtype: object

답변:


8

난 당신이 필요하다고 생각 concatkeys파라미터 axis=1에 의해 수준의 최종 변경 순서 DataFrame.swaplevel에 의해 첫 번째 레벨로 정렬DataFrame.sort_index :

df1 = (pd.concat([A, B], axis=1, keys=('A','B'))
         .swaplevel(0,1, axis=1)
         .sort_index(axis=1, level=0))
print (df1)
  Col 1    Col 2    Col 3   
      A  B     A  B     A  B
0     A  B     A  B     A  B
1     A  B     A  B     A  B
2     A  B     A  B     A  B
3     A  B     A  B     A  B
4     A  B     A  B     A  B

작업에 MultiIndex사용 가능DataFrame.xs :

print (df1.xs('Col 1', axis=1, level=0))
   A  B
0  A  B
1  A  B
2  A  B
3  A  B
4  A  B

원하는 경우 MultiIndex column 하려면 tuple다음을 사용하십시오 .

print (df1[('Col 1', 'A')])
0    A
1    A
2    A
3    A
4    A
Name: (Col 1, A), dtype: object

색인 및 열별로 선택하려면 loc다음을 사용하십시오 .

print (df1.loc[4, ('Col 1', 'A')])
A

2
그랬어! 대단히 감사합니다!
Melendowski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.