2014-06-11 13 views
1

면책 조항의 둘레에 : 나는 파이썬 초보자에게 오전팬더 DataFrame

나는 사람이 DataFrame가 복사되는 경우 팬더 DataFrames는 df.describe (예를 들어, np.round()를 받아 들일 수있는 이유를 알고있을 경우 부탁드립니다

)하지만 난 DataFrame 수동으로 별도로 정의 키/레이블 문자열을 사용하여 만드는 경우가 작동하지 않습니다

df = {} 
index = [...index list...] 
columns = [...key list...] 
df = pd.DataFrame(index=index, columns=columns) 

가 있습니다 : 나는 값을 삽입 한 후 np.round을 적용하는 경우 "AttributeError RINT을"(). df.describe()를 복사하면 일부 값을 변경 한 다음 np.round()를 실행하면 정상적으로 작동합니다. 둘 다 DataFrames이므로 동작이 다른 이유를 알 수 없습니다.

코드 예제 예를 제공

df1 = pd.DataFrame({'foo1' : np.random.randn(5),'foo2' : np.random.randn(5)}) 
df1.iloc[:,0] = np.round(df1.iloc[:,0],decimals=3) # works fine 
df1 

df2 = {} 
index = ['foo1','foo2','foo3'] 
columns = ['oof1','oof2'] 
df2 = pd.DataFrame(index=index, columns=columns) 

num = 0 
for i in df1.median(): 
    df2.ix[0,num] = df1.median()[num] 
    df2.ix[1,num] = df1.median()[num] 
    df2.ix[2,num] = df1.median()[num] 
    num += 1 

np.around(df2.ix[:,0],decimals=3) # gives 'AttributeError: rint' 
+0

문제를 확인할 수 있도록 이것을 재현 가능한 예제로 확장 할 수 있습니까? 필요한 경우 더미 데이터를 사용하십시오. – chrisb

+0

확인. 나는 그것에 대해 연구 할 것이다. – slierp

+0

df1 = pd.DataFrame ({ 'foo1': np.random.randn (5), 'foo2': np.random.randn (5)}) df1.iloc [:, 0] = np.round (df1 .iloc [: 0], 소수는 = 3) # 잘 작동 DF1 DF2 = {} = [ 'foo1은', '에서는 foo2', 'foo3'] 컬럼 = 'oof1' 인덱스 'oof2' ] DF2 = pd.DataFrame (인덱스 = 인덱스 컬럼 = 열) df1.median에 대한 I NUM = 0 () df2.ix [0, NUM = df1.median() NUM] df2.ix [1, num] = df1.median() [num] df2.ix [2, num] = df1.median() [num] num + = 1 np.around (df2.ix [ :, 0], decimals = 3) # 'Attribu teError : rint ' – slierp

답변

0

감사합니다.

문제는 두 번째 데이터 프레임의 dtypes가 'object'입니다. 다음 코드를 수레에 사람을 변환 할 수 있습니다 일반적으로

In [47]: df2 = df2.convert_objects(convert_numeric=True) 

In [48]: np.around(df2.ix[:,0],decimals=3) 
Out[48]: 
foo1 -0.039 
foo2 -0.039 
foo3 -0.039 
Name: oof1, dtype: float64 

, 그것은 오히려 DF2에 셀 별처럼 구축하는 것보다, 한 번에 전체 DataFrame를 구축하는 것이 좋습니다. 예를 들어, 이와 같은 작업을 수행하고 dtype을 변환하지 않아도됩니다.

In [50]: df2 = pd.DataFrame({'oof1': df1['foo1'].median(), 
    ...:      'oof2': df1['foo2'].median()}, index=index) 

In [51]: np.around(df2.ix[:,0],decimals=3) 
Out[51]: 
foo1 -0.039 
foo2 -0.039 
foo3 -0.039 
Name: oof1, dtype: float64 
+0

고마워요. 이제 DataFrames가 왜 다르게 작동하는지 이해합니다. 내 실제 코드는 각 열의 정밀도가 다르다는 점에서 조금 더 복잡합니다. 나중에 dtype을 변경하면 코드가 더 짧아지는 것 같습니다. – slierp