2017-01-12 5 views
2

나는 팬더 데이터 프레임이 AB입니다.
데이터 프레임은 동일한 색인과 열을 가지며 다른 데이터 만 나타납니다. 인덱스의 서브 세트 인 추가 배열 X이 있습니다. I 달성 싶은조건이있는 팬더 데이터 프레임 결합/연결

: 또한 및 B 같은 인덱스 열이 생성 행렬 C. 데이터의 경우 인덱스가 X이면 A 데이터 항목의 행 항목을 취합니다. 그렇지 않으면 B에서 행 항목을 취합니다.

나는 이것을 달성하기위한 파이썬 방법이있을 것이라고 생각했지만 컴파일하지 않았습니다. 그래서 예를 들어 나는 의 인덱스와 C dataframe을 만든 다음 같은 것들을 시도 :

C = C.apply(lambda i: A.ix[i.index] if i in X else B.ix[i.index]) 

뭔가 내가 기본적으로 수학적으로 그것을 해결 순간에 작업을해야합니다. 그래서 X을 기반으로 두 개의 불리언 배열을 만들어 AB에서 각각 원하는 항목을 지정합니다. I는 해당 행렬로 및 B 곱셈하고 C = + B 할. 이것은 해결책을 얻기 위해 매우 오랜 시간이 걸렸습니다. 나는 더 짧고 더 가독성있는 것을 뒤쫓아 갔다.

C = A.copy() 
C.update(B.iloc[X]) 

당신은 기본적 dataframes 중 하나의 사본을 가지고 일치하는 인덱스에 대한 필터를 다른 하나에서 레코드를 업데이트 :

def testIn(row): 
    return [x in X for x in row.index] 
def testOut(row): 
    return [x not in X for x in row.index] 

AMAP = C.apply(testIn, axis=0) 
BMAP = C.apply(testOut, axis=0) 

ANEW = pandas.DataFrame(AMAP*A) 
BNEW = pandas.DataFrame(BMAP*B) 

C = ANEW + BNEW 

답변

1

B = pd.DataFrame(np.zeros((6, 6)), list('ABCDEF'), list('abcdef')) 
A = pd.DataFrame(np.ones((6, 6)), B.index, B.columns) 
x = ['A', 'D'] 

pd.DataFrame.combine_first

가에서 값을 취 다음과 같은 데이터를 고려 첫 번째 데이터 프레임과 두 번째 데이터 프레임을 보충합니다. 그러나 목록 xloc을 사용하면 A을 원하는 행으로 제한하고 나머지는 B과 결합합니다.

C = A.loc[x].combine_first(B) 

print(C) 

    a b c d e f 
A 1.0 1.0 1.0 1.0 1.0 1.0 
B 0.0 0.0 0.0 0.0 0.0 0.0 
C 0.0 0.0 0.0 0.0 0.0 0.0 
D 1.0 1.0 1.0 1.0 1.0 1.0 
E 0.0 0.0 0.0 0.0 0.0 0.0 
F 0.0 0.0 0.0 0.0 0.0 0.0 

다른 대안

A.query('index in @x').combine_first(B) 

B.drop(x).append(A.loc[x]).reindex_like(A) 
물론 업데이트의
1

이런 식으로 뭔가를 수행처럼 내 현재 솔루션 보인다. 당신은 C로의 전체 사본을 절약하려면

, 당신은 X에 대해 A와 B를 분할 할 수 있습니다

C = A[~A.index.isin(X)] 
C = C.append(B.iloc[X]).reindex(A.index) 
+0

! 고맙습니다. 나는 이것을 다른 곳에서 사용하고 있었지만 여기서 그것을 해결책으로 간과했다. – MMM