2016-09-20 2 views
1

큰 데이터 세트보다 더 효율적인 그룹화를 위해 파이썬 3에서 팬더 데이터 프레임을 보관하려고합니다. 현재 성능 병목 현상은 .apply() 메소드를 사용하여 데이터 프레임을 반복하는 중입니다.반복하지 않고 팬더에서 16 진수 열 변환

열 내의 모든 항목이 16 진수이므로 pd.to_numeric 함수가 원하는대로 정확하게 수행해야합니다.

다양한 옵션을 시도했지만 지금까지 아무 것도 작동하지 않았습니다.

# This sets all values to np.nan with coerced errors, 'Unable to parse string' with raise errors. 
dataframe[bin] = pd.to_numeric(dataframe[to_bin], errors='coerce') % __NUM_BINS__ 

# Gives me "int() Cannot convert non-string with explicit base" 
dataframe[bin] = int(dataframe[to_bin].astype(str), 16) % __NUM_BINS__ 

# Value Error: Invalid literal for int with base 10 'ffffffffff' 
dataframe[bin] = dataframe.astype(np.int64) % __NUM_BINS__ 

의견이 있으십니까? 이것은 사람들이 과거에 다뤄야 만하는 것처럼 보입니다.

+1

열 엔터티를 문자열로 변환하려면이 솔루션을 사용해 보셨습니까? http://stackoverflow.com/a/22231860/1607105? 'int (x, 16)'에 HEX 값이 있다는 것을 알고 있기 위해 문자열 변환 후에'0x' 접두어를 추가해야 할 수도 있습니다. – dblclik

+0

그냥 문자열로 변환하고 값 앞에 0x를 붙이려고했지만 "int() 명시 적 기본이 아닌 문자열을 변환 할 수 없습니다"가 표시됩니다. 내 데이터 프레임을 확인하고 실제 값은 확실히 문자열 (예 : 0xfffff)입니다. – ZSmyth

+0

'list-comprehension'을 사용하고 그로부터 시리즈를 만들어 냄으로써 성능 향상을 얻을 수 있습니다. ''ser.tolist()에서 x에 대해 int (x, 16) ' –

답변

0

위에서 언급 한 내용을 뒷받침 한 후 빠른 방법은 생성기 기능을 사용하는 것입니다. 이렇게하면 16 진수로 변환 할 수없는 데이터가 제공된 경우 예외를 처리 할 수 ​​있습니다.

def bin_vals(lst): 
    for item in lst: 
     try: 
      yield int(item, 16) % __NUM_BINS__ 
     except: 
      yield __ERROR_BIN__ #whatever you store weird items in 

그런 다음 전환 부분에 다음을 수행 할 것입니다 :
dataframe['binned_value'] = [bin for bin in bin_vals(df['val_to_bin'].tolist())] 

각 행을 반복에서 상당한 속도 향상을 주도 그. 원래 사용했던 적용 방법보다 빠릅니다.