Как я могу сделать словарь из фрейма данных Pandas, где значения являются типами данных? - PullRequest
0 голосов
/ 19 февраля 2019

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

   | Variable | Type
0  | Var1     | object
1  | Var2     | np.uint16

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

Большой csv слишком велик, чтобы использовать параметр low_memory = False для pd.read_csv.

Я мог бы впоследствии изменить тип данных или вручную ввести все переменные, но у меня есть более 200 переменных ине хочу выписывать словарь явно.

Я использовал следующий код

Lookup= Lookup.set_index('Variable')
dic = Lookup.to_dict('dict')

и

dic = dict(zip(Lookup['Variable'].tolist(), Lookup['Type'].tolist()))

, но оба они сталкиваются с одной и той же проблемой:помещая 'Type' внутри кавычек в словаре, например, "np.uint16" вместо np.uint16

Это означает, что когда я запускаю read_csv:

df = pd.read_csv("input.csv", nrows=100, dtype=dic)

, я получаю ошибку "Ошибка типа: тип данных "np.uint16" не понят "

Как создать словарь, содержащий переменную и тип данных, из фрейма данных pandas, который затем можно использовать внутри оператора read_csv без ошибок?

Примечание«input.csv» имеет длину 100M + строк и 250+ столбцов, поэтому цель всего этого - заставить фрейм данных Pandas занимать как можно меньше памяти при сохранении точности.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Если это ваш файл test.csv

Name1;Number1;Number2;Name2
a;2;3.0;b

, тогда вы можете определить серию типов

types = pd.Series(data=['object', 'float', 'float', 'object'], index=['Name1', 'Number1', 'Number2', 'Name2'])
types = types.apply(eval)

и использовать это, чтобы прочитать в ваших данных:

df = pd.read_csv('test.csv', sep=';', dtype=types.to_dict())
0 голосов
/ 19 февраля 2019

Есть два способа сделать это, о которых я могу подумать.

Один из них - использовать отображение dict следующим образом:

dtype_mapping = {'np.uint8': np.uint8,
                 'np.uint16': np.uint16,
                 ...all your dtypes here...
                 'object': 'np.object'}

dtypes = [dtype_mapping[dtype] for dtype in Lookup['Type']]

dic = dict(zip(Lookup['Variable'].tolist(), dtypes)

... и затем выпродолжаем оттуда.

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

dtypes = [eval(dtype) for dtype in Lookup['Type']]

dic = dict(zip(Lookup['Variable'].tolist(), dtypes))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...