Python 写了一个带有列表的列到文件中,如何读回?

Python 写了一个带有列表的列到文件中,如何读回?,python,pandas,Python,Pandas,假设我有一个数据框,其中一列由列表填充,如下所示: c1 c2 0 "asd" ["el1", "el2"] 1 "sdf" ["el1", "el3", "el5"] 通过to_csv函数将其写入csv,自然会将列表作为字符串输出。例如,当我通过read\u csv再次读取文件时,第一个列表被读取为“[el1,el2]”,而不是预期的[“el1”,“el2”]。因此,如果我运行split命令,预期的输出是“el1”、“el2”,但我得到的是“[”、“e”、“l”、“

假设我有一个数据框,其中一列由列表填充,如下所示:

    c1    c2

0  "asd"  ["el1", "el2"]

1  "sdf"  ["el1", "el3", "el5"]
通过
to_csv
函数将其写入csv,自然会将列表作为字符串输出。例如,当我通过
read\u csv
再次读取文件时,第一个列表被读取为
“[el1,el2]”
,而不是预期的
[“el1”,“el2”]
。因此,如果我运行
split
命令,预期的输出是
“el1”、“el2”
,但我得到的是
“[”、“e”、“l”、“1”、“1”、“e”、“e”、“l”、“2”、“12”]”


我该如何避免这种情况?如何干净地写入和读取熊猫数据帧的列表列?

您可以使用
ast.literal\u eval
转换列表填充的列:

import ast

df['c2'] = df['c2'].apply(ast.literal_eval)
print (df)
    c1               c2
0  asd       [el1, el2]
1  sdf  [el1, el3, el5]
import ast
from io import StringIO

temp="""c1;c2
"asd";["el1", "el2"]
"sdf";["el1", "el3", "el5"]"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
con = lambda x: ast.literal_eval(x)
df = pd.read_csv(StringIO(temp), sep=';', converters = {'c2':con})

print (df)
    c1               c2
0  asd       [el1, el2]
1  sdf  [el1, el3, el5]
另一个想法是将
转换器
与lambda函数和
ast.literal\u eval
一起使用:

import ast

df['c2'] = df['c2'].apply(ast.literal_eval)
print (df)
    c1               c2
0  asd       [el1, el2]
1  sdf  [el1, el3, el5]
import ast
from io import StringIO

temp="""c1;c2
"asd";["el1", "el2"]
"sdf";["el1", "el3", "el5"]"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
con = lambda x: ast.literal_eval(x)
df = pd.read_csv(StringIO(temp), sep=';', converters = {'c2':con})

print (df)
    c1               c2
0  asd       [el1, el2]
1  sdf  [el1, el3, el5]

如果将数据写入csv,则始终转换为字符串,以避免使用其他格式,例如pickle和与以下格式一起使用:

您可以使用
.strip(“[]”)去掉括号,然后在逗号上使用
.split()

>>列表(“[el1,el2,el3]”。条带([])。拆分(“,”)
[“el1”、“el2”、“el3”]

不过,我不确定是否有更好的通用方法来处理熊猫中的可变长度列表。

有趣!所以,如果pickle格式如此通用,为什么它的使用频率不比csv高呢?有什么需要注意的吗?@ShirishKulhari-hmmm,可能不太容易通过任何文本编辑器检查数据,也不确定linux/wins/mac是否需要一些lib…一个更好的建议是,首先不要将它们作为列表列来编写。事实上,甚至没有列表列。@cs95:那么你有什么建议呢?假设对应于每一行,我需要维护一组字符串(这组字符串可能很大,并且每行的长度可变),您推荐的方法是什么?取决于您的数据,但您可能会分解字符串并以稀疏格式存储它们,或者至少让每个字符串占据它自己的列。