numpy.array2string не обнаруживает нативные типы - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь преобразовать кадры данных pandas в строки запроса для SQL Server.Для этого я должен сериализовать типы Python bool как 0 или 1.Я использовал:

>>>import pandas as pd
>>>import numpy as np
>>> df1 = pd.DataFrame([[0,"one",False] for l in range(5)], columns=["a","b","c"])
>>> strOut = [np.array2string(l, separator=',', formatter={'bool':lambda x: int(x)}) for l in df1.values]
>>> strOut
["[0,'one',False]", "[0,'one',False]", "[0,'one',False]", "[0,'one',False]", "[0,'one',False]"]

, однако вы можете видеть, что форматировщик numpy.array2string не обнаруживает собственный тип bool в приведенном выше примере.Если я посмотрю на пример в документах

>>> x  = np.arange(3)
>>> np.array2string(x, formatter={'int':lambda x: hex(x)})
'[0x0L 0x1L 0x2L]'

, вы увидите, что он работает.Я обнаружил тип значений в x из примера, чтобы увидеть, что они на самом деле dtype(int32) не int.Поэтому я попытался сделать то же самое в своем коде и без сигар снова.

>>> df1 = pd.DataFrame([[0,"one",False] for l in range(5)], columns=["a","b","c"])
>>> strOut = [np.array2string(l, separator=',', formatter={'int':lambda x: hex(x)}) for l in df1.values]
>>> strOut
["[0,'one',False]", "[0,'one',False]", "[0,'one',False]", "[0,'one',False]", "[0,'one',False]"]

без изменений.Есть ли способ заставить numpy.array2string работать с нативными типами?Или ... альтернативно есть лучший способ сериализации строк запроса из фреймов данных.Однако обратите внимание, что добавление внешних библиотек здесь не вариант.Я знаю, что могу внести sqlalchemy или что-то в этом роде, но ради этого вопроса мы делаем работу сами.

1 Ответ

0 голосов
/ 20 декабря 2018

Это не имеет ничего общего с array2string, не обрабатывающим логические значения.В документации четко указано, что bool является поддерживаемым типом словаря formatter.Проблема полностью связана с типом данных вашего массива, когда вы вызываете df1.values.

Вы работаете с массивом dtype object, поэтому в array2string отсутствуют ваши логические значения.Вы можете видеть это поведение, когда добавляете в средство форматирования dtype object (примечание каждое значение выбирается средством форматирования):

s = np.array2string(df1.values, separator=',', formatter={'object': lambda x: 'BAD'})
print(s)

[[BAD,BAD,BAD],
 [BAD,BAD,BAD],
 [BAD,BAD,BAD],
 [BAD,BAD,BAD],
 [BAD,BAD,BAD]]

Лично я бы обработал преобразование до того, как вы попытаетесь использовать array2string, чтобы вам не приходилось использовать formatter в массиве смешанного типа или, возможно, использовать функциютолько для отдельных серий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...