我正在尝试将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或类似的方法,但是为了这个问题,我们自己来做。
答案 0 :(得分:1)
这与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
,或可能仅在单个系列上使用该功能。