2016-04-06 66 views
7

Я пытаюсь создать пустой кадр данных с индексом и указать типы столбцов. То, как я это делаю заключается в следующем:Создать пустой Dataframe в Pandas, указав типы столбцов

df = pd.DataFrame(index=['pbp'],columns=['contract', 
             'state_and_county_code', 
             'state', 
             'county', 
             'starting_membership', 
             'starting_raw_raf', 
             'enrollment_trend', 
             'projected_membership', 
             'projected_raf'], 
           dtype=['str', 'str', 'str', 'str', 'int', 'float', 'float', 'int', 'float']) 

Однако, я получаю следующее сообщение об ошибке,

TypeError: data type not understood 

Что это значит?

+0

Я надеваю Не думаю, что вы можете указать типы dtypes таким образом, вы можете передать один тип, такой как 'str', но не список строк. dtype будет выведен, когда вы назначаете значения столбца. Я думаю, что это должно быть ненужным вообще не указывать – EdChum

+0

@EdChum, это верно в соответствии с [docs] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html), интересно, почему это почему-то конструктор не позволяет это ... не было бы более эффективным создание пустой фреймворка с типами с начала для allocati по целям? – jimijazz

ответ

2

pandas не предлагает чистую целую колонку. Вы можете использовать столбец float и преобразовать этот столбец в целое число по мере необходимости или рассматривать его как объект. То, что вы пытаетесь реализовать, - это не использование панд. Но если вы ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО хотите этого, вы можете обойти сообщение TypeError, выполнив это.

df1 = pd.DataFrame(index=['pbp'], columns=['str1','str2','str2'], dtype=str) 
df2 = pd.DataFrame(index=['pbp'], columns=['int1','int2'], dtype=int) 
df3 = pd.DataFrame(index=['pbp'], columns=['flt1','flt2'], dtype=float) 
df = pd.concat([df1, df2, df3], axis=1) 

    str1 str2 str2 int1 int2 flt1 flt2 
pbp NaN NaN NaN NaN NaN NaN NaN 

Вы можете изменить порядок заказа, как вам нравится. Но опять же, это не значит, что нужно использовать панды.

df.dtypes 
str1  object 
str2  object 
str2  object 
int1  object 
int2  object 
flt1 float64 
flt2 float64 
dtype: object 

Обратите внимание, что int рассматривается как объект.

+1

О чем ты говоришь? Конечно, Pandas поддерживает целые столбцы. – user2357112

+0

Кажется, что существует проблема с передачей 'dtype = int' без данных. – user2357112

+0

Это абсолютно похоже на ошибку - это по-прежнему поведение в последней версии. Вы его представили? – user48956

3

Хун уже ответил, что это невозможно. Так что просто замечание.

Вы можете получить по типу ошибки с помощью np.dtype:

pd.DataFrame(index = ['pbp'], columns = ['a','b'], dtype = np.dtype([('str','float')])) 

но вы получите вместо:

NotImplementedError: compound dtypes are not implementedin the DataFrame constructor 
+0

Это действительно правильный ответ. Даже исправляя TypeError, это все еще не то, что pandas потрудилось реализовать. Вы даже не можете копировать dtype из существующего DataDrame данных-составного dtype, чтобы начать новый пустой DataFrame, который действительно выглядит как допустимый прецедент. –

1

Я нашел этот вопрос после того, как работает в том же номере. Я предпочитаю следующее решение (Python 3) для создания пустого DataFrame с без индекса.

import numpy as np 
import pandas as pd 

def make_empty_typed_df(dtype): 
    tdict = np.typeDict 
    types = tuple(tdict.get(t, t) for (_, t, *__) in dtype) 
    if any(t == np.void for t in types): 
     raise NotImplementedError('Not Implemented for columns of type "void"') 
    return pd.DataFrame.from_records(np.array([tuple(t() for t in types)], dtype=dtype)).iloc[:0, :] 

Испытание это ...

from itertools import chain 

dtype = [('col%d' % i, t) for i, t in enumerate(chain(np.typeDict, set(np.typeDict.values())))] 
dtype = [(c, t) for (c, t) in dtype if (np.typeDict.get(t, t) != np.void) and not isinstance(t, int)] 

print(make_empty_typed_df(dtype)) 

Out:

Empty DataFrame 

Columns: [col0, col6, col16, col23, col24, col25, col26, col27, col29, col30, col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, col51, col52, col53, col54, col55, col56, col57, col58, col60, col61, col62, col63, col64, col65, col66, col67, col68, col69, col70, col71, col72, col73, col74, col75, col76, col77, col78, col79, col80, col81, col82, col83, col84, col85, col86, col87, col88, col89, col90, col91, col92, col93, col95, col96, col97, col98, col99, col100, col101, col102, col103, col104, col105, col106, col107, col108, col109, col110, col111, col112, col113, col114, col115, col117, col119, col120, col121, col122, col123, col124, ...] 
Index: [] 

[0 rows x 146 columns] 

И типы данных ...

print(make_empty_typed_df(dtype).dtypes) 

O ет:

col0  timedelta64[ns] 
col6    uint16 
col16    uint64 
col23    int8 
col24  timedelta64[ns] 
col25    bool 
col26   complex64 
col27    int64 
col29    float64 
col30    int8 
col31    float16 
col32    uint64 
col33    uint8 
col34    object 
col35   complex128 
col36    int64 
col37    int16 
col38    int32 
col39    int32 
col40    float16 
col41    object 
col42    uint64 
col43    object 
col44    int16 
col45    object 
col46    int64 
col47    int16 
col48    uint32 
col49    object 
col50    uint64 
       ...  
col144    int32 
col145    bool 
col146   float64 
col147  datetime64[ns] 
col148    object 
col149    object 
col150   complex128 
col151 timedelta64[ns] 
col152    int32 
col153    uint8 
col154   float64 
col156    int64 
col157    uint32 
col158    object 
col159    int8 
col160    int32 
col161    uint64 
col162    int16 
col163    uint32 
col164    object 
col165  datetime64[ns] 
col166   float32 
col167    bool 
col168   float64 
col169   complex128 
col170   float16 
col171    object 
col172    uint16 
col173   complex64 
col174   complex128 
dtype: object 

Добавления индекса становится сложнее, потому что не является истинным пропущенным значение для большинства типов данных, таким образом, они в конечном итоге получить бросили в какой-то другой тип с нативным отсутствующим значением (например, int s отлиты до float s или object s), но если у вас есть полные данные о типах, которые вы указали, вы всегда можете вставлять строки по мере необходимости, и ваши типы будут соблюдаться. Это может быть достигнуто с:

df.loc[index, :] = new_row 

Опять же, как @Hun указывал, это не то, как панды предназначена для использования.

0

Вы можете сделать это, передавая словарь в конструктор DataFrame:

df = pd.DataFrame(index=['pbp'], 
        data={'contract' : np.full(1, "", dtype=str), 
         'starting_membership' : np.full(1, np.nan, dtype=float), 
         'projected_membership' : np.full(1, np.nan, dtype=int) 
         } 
       ) 

Это правильно дать вам dataframe, который выглядит как:

 contract projected_membership starting_membership 
pbp  ""    NaN   -9223372036854775808 

С dtypes:

contract     object 
projected_membership float64 
starting_membership  int64 

Тем не менее, есть две вещи Примечание:

1) str не является фактически типом, которым может обрабатываться столбец DataFrame; вместо этого он возвращается к общему случаю object. Он будет работать нормально.

2) Почему вы не видите NaN под starting_membership? Ну, NaN определяется только для поплавков; для целых чисел нет значения «Нет», поэтому оно отличает np.NaN целому числу. Если вы хотите другое значение по умолчанию, вы можете изменить его в вызове np.full.

+0

Не нужно класть кучу фиктивных данных в столбцы, когда вы можете использовать пустые массивы. – user2357112

1

Это действительно пахнет как ошибка.

Это еще одно (более простое) решение.

def df_empty(columns, dtypes, index=None): 
    df = pd.DataFrame(index=index) 
    for c,d in zip(columns, dtypes): 
     df[c] = pd.Series(dtype=d) 
    return df 

ДФ = df_empty ([ 'а', 'б'], dtypes = [np.int64, np.int64,] список печати (df.dtypes) # int64, int64

Смежные вопросы