2013-10-27 6 views
0

'mass'열에 float64가있는 pandas DataFrame이 있습니다. 이 데이터의 첫 번째 차이점을 찾으려면 np.diff()을 사용합니다.numpy.diff() with pandas DataFrame 오류

문제점 : data.mass 대 data.mass.values를 사용하면 크기가 변경됨 이 '버그'는 최소, 최대 및 평균이 동일하지 않음을 나타냅니다. .

import pandas as pd 
import numpy as np 

data = pd.DataFrame({'time': np.arange(1,101), 'mass': randn(100)}) 
dm = np.diff(data.mass, n=1) 
dmv = np.diff(data.mass.values, n=1) 

print 'data.mass: \t\t', dm.shape 
print 'min: ', dm.min(), ' max: ', dm.max(), ' mean: ', dm.mean() 

print '' 
print 'now using data.mass.values in the calculations \n' 
print 'data.mass.values: \t', dmv.shape 
print 'min: ', dmv.min(), ' max: ', dmv.max(), ' mean: ', dmv.mean() 

되는 출력 :

data.mass:  (100,) 
min: 0.0 max: 0.0 mean: 0.0 

now using data.mass.values in the calculations 

data.mass.values: (99,) 
min: -3.49992599537 max: 2.52901842461 mean: -0.00718375066572 

이 예상 된 기능인가? 어쨌든 후드 아래에서 팬더 DataFrames가 numpy 배열로 이해했기 때문에 왜 .value을 사용해야할까요?

+0

는''data.diff()''를 사용합니다. 데이터 프레임은 numpy를 보류하고 대부분은 numpy 메서드를 사용할 수 있지만''np.diff''는 잘 작동하지 않는 함수입니다 (사실 numpy 보장을 위반합니다). 올바른 객체를 반환하여 호출자에게 응답하지 않습니다. 이는 단지 이와 같은 예에서 나타납니다. 이것은이 문제를 다루는 판다 0.13 (매우 빨리 다가옴)에서 '고정'되어 있습니다. – Jeff

+0

@jeff 설명해 주셔서 감사합니다! 나는 numpy 보장이 수반하는 것에 관해 읽어야 할 것이다. –

답변

0

@jeff의 의견을 바탕으로, .diff() 팬더 데이터 프레임 방법을 사용하면 다음과 같은 올바른 결과를 얻을 수 있습니다. 따라서 이것은 분명히 numpy 메서드와 현재 버전의 팬더 사이의 잘못된 상호 작용입니다.

import pandas as pd 
import numpy as np 

data = pd.DataFrame({'time': np.arange(1,101), 'mass': np.random.randn(100)}) 
dm = np.diff(data.mass, n=1) 
dmv = np.diff(data.mass.values, n=1) 

print 'data.mass: \t\t', dm.shape 
print 'min: ', dm.min(), ' max: ', dm.max(), ' mean: ', dm.mean() 

print '' 
print 'now using data.mass.values in the calculations \n' 
print 'data.mass.values: \t', dmv.shape 
print 'min: ', dmv.min(), ' max: ', dmv.max(), ' mean: ', dmv.mean() 

print '' 
dm_p = data.mass.diff() 
print 'now based on what @jeff said: ' 
print 'using .diff() : \t', dm_p.shape 
print 'min: ', dm_p.min(), ' max: ', dm_p.max(), ' mean: ', dm_p.mean() 

이 출력 (NumPy와 1.7.1 파이썬 2.7 0.12.0 팬더 용) :

data.mass:  (100,) 
min: 0.0 max: 0.0 mean: 0.0 

now using data.mass.values in the calculations 

data.mass.values: (99,) 
min: -3.54980400026 max: 3.33045231942 mean: 0.0326969806441 

now based on what @jeff said: 
using .diff() :  (100,) 
min: -3.54980400026 max: 3.33045231942 mean: 0.0326969806441 

예상.