numpy.array2string未检测到本机类型

时间:2018-12-19 21:08:54

标签: python numpy serialization

我正在尝试将pandas数据帧转换为SQL Server的查询字符串。为此,我将python bool类型序列化为01。 我一直在使用:

>>>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 :(得分:1)

这与array2string不处理布尔值无关。该文档明确指出boolformatter字典的受支持类型。问题完全与调用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,或可能仅在单个系列上使用该功能。