2016-09-02 2 views
5

프레임의 어느 위치 에나있을 수있는 두 행을 비교하는 데이터 프레임에서 좀 더 복잡한 연산을 수행하고 있습니다.팬더 : 시리즈 또는 나노가 존재하지 않으면 유일한 값을 얻으십시오.

import pandas as pd 
import numpy as np 

D = {'A':['a','a','c','e','e','b','b'],'B':['c','f','a','b','d','a','e']\ 
,'AW':[1,2,3,4,5,6,7],'BW':[10,20,30,40,50,60,70]} 
P = pd.DataFrame(D) 
P = P.sort_values(['A','B']) 
P['AB'] = P.A+'_'+P.B 
P['AWBW'] = P.AW+P.BW 

이제 내가 여기서 뭐하는 거지 것은 내가 예를 내가 AB 전화 a_c를 들어, AB에서 문자열의 짝을 가지고있다 :

다음은 예입니다. 그리고 역방향 페어링 c_a도 있습니다. 각 페어링에 대해 AWBW의 숫자를 합하여 AWBW이라고합니다.

이제 c_a의 값에서 a_c의 합계 값을 빼고 양쪽 변형이있는 모든 문자열 쌍에 대해 동일한 작업을 수행하려고합니다. 다른 모든 값은 나의 결과는 다음과 같이한다 NaN해야한다 :

A AW B BW AB AWBW RowDelta 
0 a 1 c 10 a_c 11  -22.0 
1 a 2 f 20 a_f 22  NaN 
5 b 6 a 60 b_a 66  NaN 
6 b 7 e 70 b_e 77  33.0 
2 c 3 a 30 c_a 33  22.0 
3 e 4 b 40 e_b 44  -33.0 
4 e 5 d 50 e_d 55  NaN 

는 거의이 작업을 수행하는 방법을 해결했다,하지만 난에 붙어있어 남은 한 가지 문제가있다.

여기에 지금까지 내 해결책 :

for i,row in P.iterrows(): 
    P.ix[i,'RowDelta'] = row['AWBW']\ 
    - P[(P['A'] == row.AB[2]) & (P['B'] == row.AB[0])]['AWBW'].get(0,np.nan) 

문제는 P[(P['A'] == row.AB[2]) & (P['B'] == row.AB[0])]['AWBW'] 중 하나 비어 있거나 인덱스가 그러나 변수 정확히 하나 개의 요소가 시리즈를 반환합니다.

이제 series.get 방법은 시리즈가 비어 있지만 내가 0 사용이 경우, 최종 인덱스 값을 원할 때 NaN을 반환하는 문제를 해결,하지만 난 거기에 동적 색인을 얻을 수 없습니다. 시리즈가 비어 있고 T.index[0]을 수행 할 때이 오류로 연결하면 인덱스가 없기 때문에

나는 예를

T = P[(P['A'] == row.AB[2]) & (P['B'] == row.AB[0])]['AWBW'] 
T.get(T.index[0],np.nan) 

위해이 작업을 수행 할 수 없습니다. iloc을 사용하여 시도 할 때도 마찬가지입니다.

빈 시리즈의 대/소문자를 동시에 처리하면서 하나의 요소가 있고 (둘 이상이 아닌) 일련의 알 수없는 색인을 동적으로 가져 오는 방법이 있습니까?

+1

"AB"의 분할을 역 자체에 병합하는 것으로 시작하십시오. 'AB = P.AB.str.split ('_', expand = True)'뒤에 AB.merge (AB, left_on = [0, 1], right_on = [1, 0])'가옵니다. – piRSquared

+0

나는 고마워. 고마워. 나는 그때 내 자신의 질문에 대답 할 것이다. – Khris

답변

2

신용 솔루션에 대한 올바른 방향으로 나를 가리키는 위해 piRSquared로 이동 :

AB = P.AB.str.split('_', expand=True) 
AB = AB.merge(AB, left_on=[0, 1], right_on=[1, 0],how='inner')[[0,1]] 
AB = AB.merge(P,left_on=[0,1], right_on=['A','B'])[['A','AW','B','BW']] 
AB = AB.merge(P,left_on=['A','B'], right_on=['B','A'])[['AW_x','BW_x','AW_y','BW_y','AB']] 
AB['RowDelta'] = AB.AW_y+AB.BW_y-AB.AW_x-AB.BW_x 
P = P.merge(AB[['AB','RowDelta']],on='AB',how='outer') 

어쩌면이 짧거나 더 좋은 만들 수 있습니다, 그것은 확실히 작동합니다.

관련 문제