Как установить 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 к обоим столбцам.
В конце я хотел бы просто передать ему список типов данных так же, как я могу передать ему список имен столбцов.
Ответы
Ответ 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