将 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 文件。
希望对您有所帮助
我正在将 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 文件。
希望对您有所帮助