我有一个Dataframe,其中每行包含一个句子,后跟一个使用spaCy创建的词性标记列表:
df.head()
question POS_tags
0 A title for my ... [DT, NN, IN,...]
1 If one of the ... [IN, CD, IN,...]
当我将DataFrame写入csv文件(encoding =' utf-8')并重新打开它时,看起来数据格式已经改变,POS标签现在出现在引号和#之间39; '像这样:
df.head()
question POS_tags
0 A title for my ... ['DT', 'NN', 'IN',...]
1 If one of the ... ['IN', 'CD', 'IN',...]
当我现在尝试将POS标签用于某些操作时,事实证明它们不再是列表,而是成为甚至包含引号的字符串。他们看起来仍然像列表,但不是。这样做很明显:
q = df['POS_tags']
q = list(q)
print(q)
结果是:
["['DT', 'NN', 'IN']"]
这里发生了什么?
我要么想要列' POS_tags '包含列表,即使在保存到csv并重新打开之后。或者我想对列' POS_tags '进行操作。再次拥有SpaCy最初创建的相同列表。有什么建议怎么做?
答案 0 :(得分:1)
为了保留DataFrame的确切结构,一个简单的解决方案是使用pd.to_pickle
将pickle格式的DF序列化,而不是使用csv
,这将始终丢弃有关数据类型的所有信息,重新导入后需要手动重建。泡菜的一个缺点是它不是人类可读的。
# Save to pickle
df.to_pickle('pickle-file.pkl')
# Save with compression
df.to_pickle('pickle-file.pkl.gz', compression='gzip')
# Load pickle from disk
df = pd.read_pickle('pickle-file.pkl') # or...
df = pd.read_pickle('pickle-file.pkl.gz', compression='gzip')
如果您已经从CSV导入,则应将POS_tags
列从字符串转换为python列表:
from ast import literal_eval
df['POS_tags'] = df['POS_tags'].apply(literal_eval)