2014-03-04 2 views
2

df라는 팬더 데이터 프레임이 있습니다. 다음 작업을 수행 할 때 :왜 dataframe.values가 매우 느린가

A = df.values ​​내가 확인할 때 그런 다음 : 를 A는 false를 반환 df.values ​​ 입니다.

심지어 내가 type(A)type(df.values)을 검사 할 때하지만, 모두 numpy.ndarray

으로 문자열과 숫자 데이터의 또한, 내 DF 혼합 한 데이터 유형을 다시 실행하십시오. 전화 A[10,1]이 전화보다 훨씬 빠릅니다. df.values[10,1

df.values를 호출 할 때 무슨 일이 일어나는지 궁금합니다.

감사 .values 호출 혼합형의 DataFrames 들어

답변

3

는 전방위 DTYPE NumPy와 하나 개의 배열 (각 DTYPE위한) 다수의 블록으로 변환한다. 이 변환은 큰 프레임의 경우 느려질 수 있습니다.

In [11]: pd.DataFrame([[1, 2.]]).values 
Out[11]: array([[ 1., 2.]]) 

In [12]: pd.DataFrame([[1, 2., 'a']]).values 
Out[12]: array([[1, 2.0, 'a']], dtype=object) 

타이밍을 가진 예 :

In [21]: df = pd.DataFrame(np.random.randn(10000)) 

In [22]: %timeit df.values # no conversion 
100000 loops, best of 3: 3.72 µs per loop 

In [23]: df[1] = 'a' # add column of object dtype 

In [24]: %timeit df.values # conversion to object dtype 
1000 loops, best of 3: 681 µs per loop 

당신은 ._data 속성을 통해 BlockManager에 저장하는 방법을 데이터를 볼 수 있습니다. 이 값은 계산 복귀 NumPy와 배열이 다른 ID/메모리 주소를 가지고 있으므로 A is df.values이 False마다 인 특성 때문에

는, 질문에 답한다. numpy의 array_equal과 같은 것을 사용해야합니다.

In [31]: df.values is df.values 
Out[31]: False 

In [32]: np.array_equal(df.values, df.values) 
Out[32]: True 
+0

설명해 주셔서 감사합니다. 이제는 .value 호출에 대한 기본 동작 방식을 이해합니다. – user3377229

관련 문제