将 kdb table 保存到数据帧,然后将数据帧保存到 csv。空值和字符串值输出到 csv 不正确?

Saving a kdb table to a dataframe then saving the dataframe to a csv. null and string values outputting to csv incorrectly?

我正在将 kdb table 保存到数据帧,然后将数据帧保存到 csv。但是,这适用于 csv 文件,如果我打印(数据帧);空值显示为“b”,所有其他字符串值显示为“b'STRING'”。

运行 Python 3.7,pandas 0.24.2 和 qpython 2.0.0。

df = pandas.DataFrame(qpython query)
df.to_csv(path_or_buf="",
          sep=",", na_rep='',
          float_format=None,
          columns=None,
          header=True, index=False,
          index_label=None, mode='w+', compression=None, quoting=None, quotechar='"',
          line_terminator="\n", chunksize=50, tupleize_cols=None, date_format=None,
          doublequote=True,
          escapechar=None, decimal='.', encoding='utf-8')

我希望 KDB table 能够正确输出到 csv,空值是一个空列,字符串只显示字符串,没有“b'STRING'”。

如有任何建议或帮助,我们将不胜感激。如果有人需要更多信息,我很乐意提供。

csv 格式的示例:

空单元格显示为:b

包含字符串的单元格显示为:“b'Euro'”,而实际上应该只显示 "Euro"

我希望 kdb 中的字符串能够得到很好的处理,因为 QPYTHON 应该将空字符串转换为 python 空字符串。但是,空符号会转换为 _QNULL_SYM。在这种情况下,我认为 'b' 前缀表示字节文字。您可以尝试在保存到 csv 之前解码字节对象

通常在python我会做以下事情

df['STRINGCOL'] = df['STRINGCOL'].apply(lambda s: s.decode('utf-8'))

我对 QPYTHON 没有太多经验,但我相信使用 qnull() 会将 null 转换为 pythonic 值。

df['STRINGCOL'] = df['STRINGCOL'].apply(lambda s: qnull(s))

qPython 具有一些将 kdb table 转换为 pandas 数据帧的功能。我首先在 kdb "t" 中创建一个 table,它有 4 列,其中第三列是符号列,第四列是字符列。第一行中的条目完全为空。

t:([] a: 0N, til 99; b: 0Nf, 99?1f; c: `, 99?`3; d: " ", 99?" ")
a b         c   d
-----------------

0 0.4123573 iee x
1 0.8397208 app l
2 0.3392927 ncm w
3 0.285506  pjn c

然后可以使用 QConnection 将 table 读入 Python。如果我们在读入后将 table 转换为数据帧,我们可以看到符号和字符被转换为字节,而空值未正确转换。

df=pandas.DataFrame(q('t'))
df.head()
                       a           b         c     d
0   -9223372036854775808         NaN       b''  b' '
1                      0    0.412357    b'iee'  b'x'
2                      1    0.839721    b'app'  b'l'
3                      2    0.339293    b'ncm'  b'w'
4                      3    0.285506    b'pjn'  b'c'

但是,如果我们在 q 查询中使用 pandas=True 参数,那么大部分 table 都会根据需要进行适当的转换:

df=q('t', pandas=True)
df.head()
      a        b         c  d
0   NaN      NaN       b''  
1   0.0 0.412357    b'iee'  x
2   1.0 0.839721    b'app'  l
3   2.0 0.339293    b'ncm'  w
4   3.0 0.285506    b'pjn'  c

但是请注意,在 kdb 中存储为符号的条目未按需要转换。在这种情况下,以下代码将使用与 Callum 建议的方法类似的方法手动将 string_cols 中指定的任何列从字节解码为字符串。

string_cols = ['c']
df[string_cols] = df[string_cols].applymap(lambda s : s.decode('utf-8')) 

最终结果为:

df.head()
      a        b      c d
0   NaN      NaN        
1   0.0 0.412357    iee x
2   1.0 0.839721    app l
3   2.0 0.339293    ncm w
4   3.0 0.285506    pjn c

可以轻松转换为 csv 文件。

希望对您有所帮助