Извлечение явных типов для всех столбцов в панде - PullRequest
0 голосов
/ 25 сентября 2018

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

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.Есть ли способ включить 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')}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

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

  1. Вам необходимо преобразовать серию, содержащую даты явно, в datetime, если в настоящее время она имеет object dtype.
  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}
0 голосов
/ 25 сентября 2018

Вы можете использовать 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()])

Out:

 {'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')}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...