如何解决Pandas将Parquet转CSV时向量内容换行的问题?
解决Spark MLlib Word2Vec输出Parquet转CSV时向量换行问题
我明白你遇到的麻烦了——把Spark MLlib输出的Word2Vec Parquet文件转成CSV时,原本的向量字符串被拆得乱七八糟甚至换行。这问题的根源很简单:你用空格作为CSV的分隔符,但向量本身就包含大量空格,Pandas会把这些空格当成列分隔的标记,自然就把一个向量拆成了多个“列”,最终输出时就乱套了。
给你几个可行的解决办法,按需选择:
方法1:改用逗号作为CSV分隔符(最稳妥)
CSV格式默认就是用逗号分隔的,这样向量里的空格不会被误解析,Pandas还会自动给带空格的字段加上引号,完美保留向量的完整格式:
import pandas as pd import pyarrow.parquet as pq # 读取Parquet文件 data = pq.read_pandas('C://Users//...//p.parquet', columns=['word', 'vector']).to_pandas() # 用逗号分隔写入CSV data.to_csv('C://Users/...//p.csv', sep=",", encoding='utf-8', columns=['word', 'vector'], index=False, header=False)
方法2:坚持用空格分隔,强制给向量加引号
如果你必须用空格作为分隔符,可以通过quoting参数让Pandas自动给带空格的字段(也就是你的向量)加上引号,这样空格分隔符就不会拆分向量内容了:
import pandas as pd import pyarrow.parquet as pq import csv data = pq.read_pandas('C://Users//...//p.parquet', columns=['word', 'vector']).to_pandas() # 设置QUOTE_NONNUMERIC,让非数字字段自动加引号 data.to_csv('C://Users/...//p.csv', sep=" ", encoding='utf-8', columns=['word', 'vector'], index=False, header=False, quoting=csv.QUOTE_NONNUMERIC)
或者你也可以手动给向量字段包裹双引号,然后关闭自动引号功能:
import pandas as pd import pyarrow.parquet as pq import csv data = pq.read_pandas('C://Users//...//p.parquet', columns=['word', 'vector']).to_pandas() # 手动给向量加上双引号 data['vector'] = '"' + data['vector'] + '"' # 写入时关闭自动引号,避免重复加引号 data.to_csv('C://Users/...//p.csv', sep=" ", encoding='utf-8', columns=['word', 'vector'], index=False, header=False, quoting=csv.QUOTE_NONE)
试一下上面的方法,你的CSV输出应该就能和Parquet里的格式完全一致了。
内容的提问来源于stack exchange,提问作者MeirDayan
相关产品推荐
相关产品推荐

