2013-10-29 3 views
1

기존 데이터 프레임에 여러 데이터 열을 추가하려고합니다. 데이터 프레임 자체는 수많은 다른 데이터 프레임으로 만들어졌으며, 동일한 인덱스에 성공적으로 합류했습니다. 이를 위해,이 같은 코드를 사용 :팬더 : 열 데이터를 기반으로 데이터 프레임을 병합하거나 결합합니까?

data = p_data.join(r_data) 

실제로 다중 색인에이 합류를, 그래서 dataframe은 이름 1 이름 2 인덱스있는 다음과 같은 것이 보인다 :

Name1 Name2 present r  behavior 
    a  1  1   0  0 
      2  1   .5  2 
      4  3   .125 1 
    b  2  1   0  0 
      4  5   .25 4 
      8  1   0  1 

을 따라서 Name1 인덱스는 데이터를 반복하지 않지만 Name2 인덱스는 않습니다 (이름 쌍을 추적하기 위해이 이름을 사용하므로 Name2 & Name2는 함께 한 번만 나타납니다). 지금 내가 추가하고 싶은 것은 Name2 데이터 (두 번째 구성원의 정보)에 해당하는 4 열의 데이터입니다. "현재" "r"및 "행동"데이터와 달리,이 데이터는 쌍방 단위가 아닌 개인 단위입니다. 따라서 병합 할 때 Name1 데이터를 고려할 필요가 없습니다.

문제는 NAME2 데이터가 다이 애드 콤보를 배출을 반복하는 동안, 데이터의 "NAME2"열이 나는 이제 NAME2 개인마다 하나의 데이터가 추가 할 것입니다 :

Name2 Data1 Data2 Data3 
    1  80  6  1 
    2  61  8  3 
    4  45  7  2 
    8  30  3  6 

을 I 출력 모양을하고 싶은 것 : 문서를 읽기에도 불구하고

Name1 Name2 present r  behavior Data1 Data2 Data3 
    a  1  1   0  0   80  6  1 
      2  1   .5  2   61  8  3 
      4  3   .125 1   45  7  2 
    b  2  1   0  0   61  8  3 
      4  5   .25 4   45  7  2 
      8  1   0  1   30  3  6 

, 내가 원하는 결과를 위해()에 가입() 또는 병합 사용할 수 있는지 여부에 명확하지 않다. 이전에 사용한 간단한 데이터 프레임과 같은 기존 데이터 프레임에 조인을 시도하면 새로운 열로 끝나지 만 NaN 값으로 가득 찼습니다. 또한 Name1과 Name2를 사용하여 여러 가지 조합을 시도했는데, 조인 또는 병합 (소리가 나지 않게 임의로 생성되지는 않지만 문서를 올바르게 해석하지는 못합니다!)과 함께 색인 또는 색인으로 사용했습니다. 내가 지금 매우 잃어 버렸기 때문에 당신의 도움은 매우 감사하게 될 것입니다.

답변

1

가장 좋은 방법인지 확실하지 않지만 reset_index을 사용하면 원래 데이터 프레임을 Name2으로 임시 색인화 할 수 있습니다. 평소대로 join을 수행 할 수 있습니다. ,

import pandas as pd 

df = pd.DataFrame({'Name1':['a','a','a','b','b','b'], 
        'Name2':[1,2,4,2,4,8], 
        'present':[1,1,3,1,5,1]}) 
df.set_index(['Name1','Name2'], inplace=True) 

df2 = pd.DataFrame({'Data1':[80,61,45,30], 
        'Data2':[6,8,7,3]}, 
        index=pd.Series([1,2,4,8], name='Name2')) 
result = df.reset_index(level=0).join(df2).set_index('Name1', append=True) 
print(result) 
#    present Data1 Data2 
# Name2 Name1      
# 1  a   1  80  6 
# 2  a   1  61  8 
#  b   1  61  8 
# 4  a   3  45  7 
#  b   5  45  7 
# 8  b   1  30  3 

이 결과가 훨씬 더 원하는 DataFrame처럼 보이게하기 위해 당신은 순서와 인덱스 정렬 할 수 있습니다 : : 그런 다음 다시 MultiIndex의 Name1 부분을 만들기 위해 set_index를 사용하여이 작동

print(result.reorder_levels([1,0],axis=0).sort(axis=0)) 
#    present Data1 Data2 
# Name1 Name2      
# a  1   1  80  6 
#  2   1  61  8 
#  4   3  45  7 
# b  2   1  61  8 
#  4   5  45  7 
#  8   1  30  3 
+0

를 - 내가해야 이것이 시도한 접근 방식 중 하나 인 잘못된 매개 변수를 설정하고 있습니다. 내가 완전히 잘못된 방향으로 방황하고있는 것이 아니라는 것을 알고있다.) –

관련 문제