2016-06-23 4 views
0

Я использую Pandas 0.18.1 с python 2.7.x. У меня есть пустой фреймворк, который я читаю первым. Я вижу, что типы этих столбцов: object, что в порядке. Когда я назначаю одну строку данных, тип для числовых значений изменяется на float64. Я ожидал int или int64. Почему это происходит?Pandas: Почему используется тип столбца по умолчанию для числового поплавка?

Есть ли способ установить какой-либо глобальный параметр, чтобы Pandas знал, что для числовых значений обрабатывайте их по умолчанию как 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

Pandas не может хранить значения NaN в целых столбцах.

Это делает float очевидным выбором по умолчанию для хранения данных, поскольку, как только пропадает значение, Pandas должен будет изменить тип данных для всего столбца. И недостающие значения возникают очень часто на практике.

Что касается , почему это ограничение, унаследованное от Numpy. В принципе, Pandas нужно выделить конкретную битовую диаграмму для представления NaN. Это просто для чисел с плавающей запятой, и это определено в стандарте IEEE 754. Это более неудобно и менее эффективно делать это для целочисленного значения фиксированной ширины.

2

почему почти наверняка связано с гибкостью и скоростью. Просто потому, что Pandas видел только целое число в этом столбце до сих пор, это не означает, что вы не собираетесь позже добавлять float, что потребует от Pandas вернуться и изменить тип для всего столбца. Поплавок является наиболее надежным/гибким цифровым типом.

Нет глобального способа переопределить это поведение (что я знаю), но вы можете использовать метод astype для изменения отдельного 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 

Если вы не знаете имен столбцов в вашей пустой dataframe, вы можете сначала присвоить все как int, а затем пусть панды разбирайтесь.

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