Извлечь явные типы для всех столбцов в фрейме данных pandas

У меня есть фрейм данных, который выглядит так:

acquisition_date    conductivity    manufacturer    number_bought   price_per_unit  runtime
0   05/25/2008 06:20 PM     115.372339  555-timer   1   9.909869    685.378635
1   07/05/2008 01:58 PM     96.981356   diode   6   11.673483   1020.772530
2   03/25/2008 08:52 AM     103.809491  resistor    7   9.879431    910.086424
3   10/31/2008 05:28 PM     95.805199   transistor  5   10.097940   912.137440
4   03/17/2008 06:58 PM     98.447452   thermistor  0   12.280878   1277.008237

где date содержит timestamp, а manufacturer содержит тип данных string. Я хочу просмотреть фрейм данных, столбец за столбцом, и создать словарь, ключи которого являются типом данных, а значения - столбцами с заданным типом данных.

Вот чем я сейчас занимаюсь:

g = dframe.columns.to_series().groupby(dframe.dtypes).groups
data_types = {k.name: v for k, v in g.items()}

а data_types выглядит так:

{'float64': Index(['conductivity', 'price_per_unit', 'runtime'], dtype='object'),
 'int64': Index(['number_bought'], dtype='object'),
 'object': Index(['acquisition_date', 'manufacturer'], dtype='object')}

где acquisition_date и manufacturer рассматриваются не как timestamp и string, а как objects. Есть ли способ включить в этот dict timestamp, string и другие возможные типы данных?

Обновлено: Просто чтобы убедиться, что я четко понял, о чем прошу. Я хочу изменить приведенный выше код, чтобы получить:

{'float64': Index(['conductivity', 'price_per_unit', 'runtime'], dtype='object'),
 'int64': Index(['number_bought'], dtype='object'),
 'timestamp': Index(['acquisition_date'], dtype='object'),
 'string': Index(['manufacturer'], dtype='object')}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
380
2

Ответы 2

Вы можете использовать df.dtypes для получения типа данных столбцов, после чего вы можете создать словарь с использованием объектов в качестве ключей и столбцов в качестве значений

df1.acquisition_date = pd.to_datetime(df1.acquisition_date)
dict([(i.name,df1.dtypes[df1.dtypes==i].index) for i in df1.dtypes.unique()])

Из:

 {'datetime64[ns]': Index(['acquisition_date'], dtype='object'),
 'float64': Index(['conductivity', 'price_per_unit', 'runtime'], dtype='object'),
 'int64': Index(['number_bought'], dtype='object'),
 'object': Index(['manufacturer'], dtype='object')}

Я не понимаю о чем ты. Все, что я хочу, это чтобы мой код, приведенный выше, мог разделить класс «объект» на два разных, «строку» и «временную метку» в этом словаре.

Qubix 25.09.2018 15:57

@Qubix это что-то вроде этого, вы можете изменить ключ datetime64, если хотите

Naga kiran 25.09.2018 16:10

Следует отметить два момента:

  1. Вам необходимо преобразовать ряд, содержащий даты явно, в datetime, если он в настоящее время имеет dtype object.
  2. string dtype не существует. Pandas использует object dtype для хранения произвольных объектов Python.

Таким образом, вы можете использовать pd.to_datetime. Предполагается, что object dtype будет содержать только строки. Для правильной проверки этого придется проверять каждое значение в отдельности, это дорого и не рекомендуется. Вот демонстрация:

df = pd.DataFrame({'A': pd.to_datetime(['2018-01-01', '2018-11-30']),
                   'B': [4352.123, 5364.1],
                   'C': [423, 2134],
                   'D': ['SomeString', 'AnotherString'],
                   'E': [653.213, 764.1234],
                   'F': [True, False]})

g = df.columns.to_series().groupby(df.dtypes).groups

data_types = {k.name: v for k, v in g.items()}

Результат:

{'bool': Index(['F'], dtype='object'),
 'datetime64[ns]': Index(['A'], dtype='object'),
 'float64': Index(['B', 'E'], dtype='object'),
 'int64': Index(['C'], dtype='object'),
 'object': Index(['D'], dtype='object')}

Обратите внимание, что вы также можете использовать pd.DataFrame.select_dtypes:

data_types = {i: df.select_dtypes(include=[i]).columns for i in df.dtypes}

Другие вопросы по теме