2016-06-23 6 views
0

저는 파이썬 2.7.x와 함께 팬더 0.18.1을 사용하고 있습니다. 먼저 읽은 빈 데이터 프레임이 있습니다. 나는이 열의 유형이 OK 인 object임을 확인합니다. 한 행의 데이터를 지정하면 숫자 값의 유형이 float64으로 변경됩니다. 나는 int 또는 int64을 기대하고있었습니다. 왜 이런 일이 생길까요?팬더 : 숫자 플로트의 기본 열 유형이 왜입니까?

숫자 값의 경우 .이 아닌 이상 팬더는 숫자 값이 기본적으로 int으로 처리된다는 것을 알기 위해 일부 전역 옵션을 설정하는 방법이 있습니까? 예를 들어, [0 1.0, 2.], 첫 번째 열은 int이지만 다른 두 개는 float64? 예를 들어

:

>>> df = pd.read_csv('foo.csv', engine='python', keep_default_na=False) 
>>> print df.dtypes 
bbox_id_seqno object 
type    object 
layer   object 
ll_x    object 
ll_y    object 
ur_x    object 
ur_y    object 
polygon_count object 
dtype: object 
>>> df.loc[0] = ['a', 'b', 'c', 1, 2, 3, 4, 5] 
>>> print df.dtypes 
bbox_id_seqno  object 
type    object 
layer    object 
ll_x    float64 
ll_y    float64 
ur_x    float64 
ur_y    float64 
polygon_count float64 
dtype: object 

답변

3

팬더가 정수 열에 NaN 값을 저장할 수 없습니다.

이렇게하면 누락 된 값이 나오 자마자 팬더가 전체 열의 데이터 형식을 변경해야하기 때문에 float이 데이터 저장을위한 확실한 기본 선택이됩니다. 그리고 누락 된 가치는 실제로 실제로 발생합니다.

인 이유는 Numpy로부터 계승 된 제한 사항입니다. 기본적으로 팬더는 NaN을 나타내는 특정 비트 패턴을 제쳐 놓아야합니다. 부동 소수점 숫자는 직관적이며 IEEE 754 표준에 정의되어 있습니다. 고정 너비 정수의 경우이를 수행하는 것이 더 어색하고 덜 효율적입니다.

2

이유는 유연성과 속도로 할 거의 확실하다. Pandas가 지금까지 그 열의 정수만을 보았 기 때문에, 나중에 플로트를 추가하려고하지 않는다는 의미는 아닙니다. Pandas가 돌아가서 모든 열의 유형을 변경해야합니다. float는 가장 강력하고 유연한 숫자 유형입니다.

해당 동작을 무시할 수있는 전역적인 방법은 없지만 astype 메서드를 사용하여 개별 DataFrame을 수정할 수 있습니다. 당신이 빈 dataframe을 읽는 경우

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html

3

, 당신은 명시 적으로 읽고 각 열에 대한 유형을 캐스팅 할 수 있습니다. 당신이 당신의 빈 dataframe에서 열 이름을 알 수없는 경우

dtypes = { 
    'bbox_id_seqno': object, 
    'type': object, 
    'layer': object, 
    'll_x': int, 
    'll_y': int, 
    'ur_x': int, 
    'ur_y': int, 
    'polygon_count': int 
} 


df = pd.read_csv('foo.csv', engine='python', keep_default_na=False) 

for col, dtype in dtypes.iteritems(): 
    df[col] = df[col].astype(dtype) 

df.loc[0] = ['a', 'b', 'c', 1, 2, 3, 4, 5] 

>>> df.dtypes 
bbox_id_seqno object 
type    object 
layer   object 
ll_x    int64 
ll_y    int64 
ur_x    int64 
ur_y    int64 
polygon_count  int64 
dtype: object 

, 당신은 처음에 int으로 모든 것을 지정하고 팬더를 일종의 그것을 밖으로하도록 할 수 있습니다.

for col in df: 
    df[col] = df[col].astype(int)