为什么我的列表在保存到 csv 并重新打开后变成字符串?Python

twh*_*ale 3 python-3.x export-to-csv pandas spacy

我有一个 Dataframe,其中每行包含一个句子,后跟一个用 spaCy 创建的词性标签列表:

df.head()

   question             POS_tags            
0  A title for my ...   [DT, NN, IN,...]  
1  If one of the ...    [IN, CD, IN,...]  
Run Code Online (Sandbox Code Playgroud)

当我将 DataFrame 写入 csv 文件(encoding='utf-8')并重新打开它时,看起来数据格式已更改,POS 标签现在出现在引号 ' ' 之间,如下所示:

df.head()

   question             POS_tags                    
0  A title for my ...   ['DT', 'NN', 'IN',...]  
1  If one of the ...    ['IN', 'CD', 'IN',...]  
Run Code Online (Sandbox Code Playgroud)

当我现在尝试使用 POS 标签进行某些操作时,结果发现它们不再是列表,而是变成了甚至包含引号的字符串。它们看起来仍然像列表,但事实并非如此。这样做时这一点很清楚:

q = df['POS_tags']
q = list(q)
print(q)
Run Code Online (Sandbox Code Playgroud)

结果是:

["['DT', 'NN', 'IN']"]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

我要么希望“ POS_tags ”列包含列表,即使在保存到 csv 并重新打开之后也是如此。或者我想对“ POS_tags ”列进行操作,以再次获得 SpaCy 最初创建的相同列表。有什么建议如何做到这一点?

Pet*_*ler 5

为了保留 DataFrame 的精确结构,一个简单的解决方案是使用pd.to_pickle, 而不是使用csv,以 pickle 格式序列化 DF,这将始终丢弃有关数据类型的所有信息,并且在重新导入后需要手动重建。pickle 的一个缺点是它不可读。

# 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')
Run Code Online (Sandbox Code Playgroud)

从 CSV 导入后修复列表

如果您已经从 CSV 导入,这应该将该POS_tags列从字符串转换为 Python 列表:

from ast import literal_eval
df['POS_tags'] = df['POS_tags'].apply(literal_eval)
Run Code Online (Sandbox Code Playgroud)