2016-09-07 3 views
0

이 항목에 대해 많은 질문이 있지만이 경우에는 제안 된 대답 중 아무 것도 작동하지 않는 것으로 생각됩니다. 지금 이틀 동안 나를 죽였어.팬더의 이전 열 값에서 행 단위로 새 열 값을 계산하는 함수 사용

이것은 아이 추적기에서 내보내기 파일을 처리하기 위해 팬더를 사용한 첫 번째 시도입니다. 내보내기 파일에는 50 개 정도의 열이 있으며 그 중 2 개에는 동공 확장 조치 인 PupilLeft 및 PupilRight가 있습니다. PupilAvg라는 두 개의 열을 평균화하는 새로운 열을 만들고 싶습니다. 시력 추적기가 한쪽 또는 양쪽 눈꺼풀을 읽을 수 없으면 -1을 기록합니다.

In[25]: dfd = pd.DataFrame.from_items([('PupilLeft', [3., -1., 4., -1]), ('PupilRight', [4., 4., -1., -1])]) 

In[26]: dfd 
Out[26]: 
    PupilLeft PupilRight 
0  3.0   4.0 
1  -1.0   4.0 
2  4.0  -1.0 
3  -1.0  -1.0 

I : 여기

def getEyeAvg(left, right): 
    # calcs avg for Left and Right where one or both may be missing (= -1) 
    if left == -1 and right == -1: return np.nan 
    if left == -1: return right 
    if right == -1: return left 
    return (left + right)/2.0 

이 dataframe의 예 버전입니다 : 필요한 논리는 간단하지만 람다에 대한 약간 긴 듯 때문에, 나는 나의 새로운 열의 값을 반환하는 함수를 작성 PupilRight 후 내 새 열을 삽입 할, 그래서 나는 명령 시도 :

In[27]: dfd.insert(2, 'PupilAvg', getEyeAvg(dfd.PupilLeft, dfd.PupilRight)) 

내가 PupilAvg에 대해 기대하는 것은 :

PupilLeft PupilRight PupilAvg 
0  3.0   4.0  3.5 
1  -1.0   4.0  4.0 
2  4.0  -1.0  4.0 
3  -1.0  -1.0  NaN 

물론이 작동하지 않습니다와 나는 또 다시 질문이 질문의 변화를 보이고했습니다

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

얻고, 각각의 대답은 이해할 것 몇 가지 다른 "속임수"를 사용하는 것 제게 상대적인 초급 상태가 주어졌습니다. 예를 들어, 'any'도 'all'rows도 남기고 싶지는 않습니다. == -1, 그냥 현재 행을 원하지만 이것은 판다가 처리하기가 매우 어려운 요청입니다.

사람이 기본적으로 내가 다른 값을 사용하여 새 열 값을 계산하는 기능을 사용하려면

"로 귀결이 문제에 대한 명확한 일반적인 솔루션을 제공 할 수 있다면 그것은 매우 도움이 될 것입니다 행 단위로 열을 한꺼번에 가져 오는 것이 아니라 Excel에서와 마찬가지로 간단하고 일반적인 방법이 있습니까? "

Excel 솔루션에서 Python/pandas로 전환하려고하는 사람들에게 특히 힘듭니다. Excel이 자연스럽게 행 단위로 이루어지기 때문입니다. 첫 번째 행 셀에 수식을 입력하고 열 아래로 끝까지 복사합니다. 분명한 것은 그 사고 방식이 판다에 대한 나의 준비를 나쁘게했다는 것이다.

답변

0

전체 열에서 작업하는 동안 목표를 달성하는 쉬운 방법이 있습니다.

dfd.replace({-1:np.nan}, inplace=True) 
dfd['PupilAvg'] = dfd.mean(axis=1) 

원래 -1 값을 유지해야하는 경우 먼저 복사 한 다음 계속하십시오. 팬더에있는 모든 것은 명백한 nan 값으로 더 쉽습니다.

데이터의 전체 열을 getEyeAvg에 전달하기 때문에 원본 코드가 실패합니다. 귀하의 예제에서 그것은 pd.DataFrame.from_items ([('PupilLeft', [3., -1, 4., -1]) == -1, 3이 아닌 == 1. == 1. 한 번에 전체 열이 팬더의 기본 모드이므로 새로운 사고 방식이 필요합니다. 가장 좋은 방법은 Excel에서 가져 오는 접근 방식이 인덱스 또는 df.apply (lambda, axis = 1) 사용)은 전체 열을 사용하는 것보다 훨씬 느립니다.

+0

위대한 솔루션입니다. 두 가지 후속 질문. 내 수식에서 사용하고있는 두 개의 열에 대해서만 dfd.replace를 어떻게 제한 할 수 있습니까? 수출 데이터의 50 개 열에 -1이있을 수 있으며 그 중 일부는 엉망이되고 싶지 않습니다. 같은 메모에서 두 개의 소스 열의 평균을 계산하고 다른 열의 같은 행에있는 다른 모든 숫자 값을 포함하지 않도록 dfd.mean 함수를 어떻게 제한 할 수 있습니까? 감사! . –

+0

'DFD [ 'PupilLeft', 'PupilRight'] = DFD [ 'PupilLeft', 'PupilRight가'] 대체 ({- 1} np.nan)' 다음 'DFD [ ' PupilAvg '] = dfd [['PupilLeft ','PupilRight ']]. 평균 (축 = 1)' –