Подтвердить что ты не робот

Как установить dtypes по столбцу в pandas DataFrame

Я хочу перенести некоторые данные в pandas DataFrame и назначить dtypes для каждого столбца при импорте. Я хочу иметь возможность сделать это для больших наборов данных с большим количеством разных столбцов, но, как пример:

myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes

результаты в:

Ошибка типа: тип данных не понят

Я попробовал несколько других методов, таких как:

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})

Ошибка типа: у объекта типа 'тип' нет len()

Если я поставлю dtype=(float,int) он применяет формат float к обоим столбцам.

В конце я хотел бы просто передать ему список типов данных так же, как я могу передать ему список имен столбцов.

4b9b3361

Ответ 1

Я только столкнулся с этим, и проблема панд все еще открыта, таким образом, я отправляю свой обходной путь. Предполагая, что df - это мой DataFrame, а dtype - это имя столбца, определяющее dtype:

for k, v in dtype.items():
    df[k] = df[k].astype(v)

(примечание: используйте dtype.iteritems() в Python 2)

Для справки:

Ответ 2

Вы можете попробовать перейти в словаре объектов Series к конструктору DataFrame - это даст вам гораздо более конкретный контроль над созданием и, надеюсь, будет более ясным, что происходит. Версия шаблона (data1 может быть массивом и т.д.):

df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
                   'column2':pd.Series(data2, dtype='type2')})

И пример с данными:

df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
                   'B':pd.Series([7,8,9], dtype='float')})

print (df)
   A  B
0  1  7.0
1  2  8.0
2  3  9.0

print (df.dtypes)
A     int32
B    float64
dtype: object

Ответ 3

при работе с типами данных они должны передаваться как строки.

Например, последний метод, который вы использовали, должен быть изменен как

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **'int'**})

вместо

mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **int**}).

Тип dtype (int, float etc.) Должен быть задан в виде строки.

Или в качестве альтернативного метода (если вы не хотите передавать в виде строк) импортируйте numpy как np и используйте mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **np.int**})

Ответ 4

Начиная с версии 0.24.2 для панд (текущий стабильный выпуск) невозможно передать явный список типов данных в конструктор DataFrame в виде состояния документов:

dtype : dtype, default None

    Data type to force. Only a single dtype is allowed. If None, infer

Тем не менее, класс dataframe имеет статический метод, позволяющий вам преобразовать простой структурный массив в dataframe, чтобы вы могли сделать:

>>> myarray = np.random.randint(0,5,size=(2,2))
>>> record = np.array(map(tuple,myarray),dtype=[('a',np.float),('b',np.int)])
>>> mydf = pd.DataFrame.from_records(record)
>>> mydf.dtypes
a    float64
b      int64
dtype: object