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

Why do my lists become strings after saving to csv and re-opening? Python

我有一个 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 标签现在出现在引号 ' ' 之间,如下所示:

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 最初创建的列表相同的列表。有什么建议如何做到这一点?

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

# 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 导入后修复列表

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

from ast import literal_eval
df['POS_tags'] = df['POS_tags'].apply(literal_eval)