我正在尝试将 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 格式化程序未检测到上面的 native 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 与 native 类型一起使用?或者..或者是否有更好的方法来序列化数据帧中的查询字符串。但请注意,此处不能选择引入外部库。我知道我可以引入 sqlalchemy 或类似的东西,但为了这个问题,我们正在自己做这项工作。
最佳答案
这与 array2string
不处理 bool 值无关。文档明确指出 bool
是 formatter
字典支持的类型。当您调用 df1.values 时,问题完全在于数组的数据类型。
您正在处理 dtype object
数组,因此 array2string
缺少 bool 值。当您添加 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
之前处理转换,这样您就不必使用格式化程序
在混合类型数组上,或者可能仅在单个系列上使用该函数。
关于python - numpy.array2string 未检测 native 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53859164/