2016-09-16 1 views
0

큰 팬더 데이터 프레임이 있습니다. 수천 개의 열과 백만 개의 행이 있습니다. 나는 최대 값과 최소값의 차이를 행별로 계산하려고한다. NaN 값이 많으며 일부 행은 모두 NaN 값입니다 (하지만 여전히 값을 유지하려고합니다!).Python의 큰 데이터 프레임에서 반복되는 코드를 최적화하는 방법

다음 코드를 작성했습니다. 작동하지만 시간이 많이 걸립니다.

totTime = [] 
for index, row in date.iterrows(): 
    myRow = row.dropna() 
    if len(myRow): 
     tt = max(myRow) - min(myRow) 
    else: 
     tt = None 
    totTime.append(tt) 

최적화 할 방법이 있습니까? 다음 코드를 시도했지만 모든 NaN 행을 만나면 오류가 발생합니다.

tt = lambda x: max(x.dropna()) - min(x.dropna()) 
totTime = date.apply(tt, axis=1) 

제안 사항을 보내주십시오!

+3

IIUC 당신이 단지 수'date.max (축 = 1) - data.min (축 = 1) ' – EdChum

+3

루프를 사용하고'apply'를 사용하지 말고 내가 제안한 벡터화 된 방법을 검색해야합니다. 대부분의 팬더 연산자는'NaN'을 정상적으로 처리 할 것이므로 조작 전이나 후에 필터링 할 필요가 있습니다 – EdChum

답변

2

는 보통 큰 pandas.DataFrame 또는 numpy.ndarray을 반복하는 pythonfor 루프를 사용하는 것은 좋지 않다. 사용 가능한 빌드는 최적화되어 있고 많은 경우 파이썬으로 작성된 것이 아니라 컴파일 된 언어로 작성되므로 함수에서 사용할 빌드를 사용해야합니다. 귀하의 경우 pandas.DataFrame.maxpandas.DataFrame.min을 사용하여 실제적으로 수동으로 삭제할 필요없이 의 nan 값을 건너 뛰는 skipna 옵션을 제공해야합니다. 또한 axis을 선택하여 최소화 할 수 있습니다. 따라서 axis=1을 지정하면 열을 따라 최소값을 얻을 수 있습니다.

이 @EdChum 그냥 코멘트에 언급 한 것과 비슷한을 추가합니다 :

data.max(axis=1, skipna=True) - data.min(axis=1, skipna=True) 
+2

'skipna'는 기본값'True'이므로 불필요합니다. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html – EdChum

+0

오, 잘 지내고 있습니다. 나는 보통 암묵적 이상으로 명시 적으로 선호하고 따라서 그것을 유지합니다. – jotasi

0

반복에 대해 동일한 문제가 있습니다. 2 점 :

  1. 왜 NaN 값을 0으로 바꾸지 않습니까? 이것을 df.replace(['inf','nan'],[0,0])으로 할 수 있습니다. 그것은 inf와 nan 값을 대체합니다.
  2. 이것을보십시오 This. 아마도 당신은 이전 행렬과 실제 행 사이의 차이를 계산하기 위해 루프를 최적화하는 방법에 대한 비슷한 질문을 이해할 수 있습니다.
+0

안녕 Juliana. 나는 NaN 값을 0으로 대체하지 않는다. NaN은 내 경우를 의미하고 0은 가능한 측정 값이기 때문이다. NaN을 0으로 바꾸려면 내 데이터가 더 이상 내 사례를 나타내지 않습니다. 나는 또한 당신이 공유 한 게시물에 동의합니다. for 루프를 피하는 것이 핵심입니다. –

관련 문제