使用Pandas读取包含列表的csv文件

23

我试图将此csv文件读入pandas中

HK,"[u'5328.1', u'5329.3', '2013-12-27 13:58:57.973614']"
HK,"[u'5328.1', u'5329.3', '2013-12-27 13:58:59.237387']"
HK,"[u'5328.1', u'5329.3', '2013-12-27 13:59:00.346325']"

你可以看到只有两列,第二列是一个列表。当使用pd.read_csv()函数和参数时,是否有一种正确解释它的方法(即将列表中的值读作列)?

谢谢。

4个回答

37

一个选项是使用ast.literal_eval作为转换器:

>>> import ast
>>> df = pd.read_clipboard(header=None, quotechar='"', sep=',', 
...                   converters={1:ast.literal_eval})
>>> df
    0                                             1
0  HK  [5328.1, 5329.3, 2013-12-27 13:58:57.973614]
1  HK  [5328.1, 5329.3, 2013-12-27 13:58:59.237387]
2  HK  [5328.1, 5329.3, 2013-12-27 13:59:00.346325]

如果需要,可以使用以下代码将这些列表转换为DataFrame:

>>> df = pd.DataFrame.from_records(df[1].tolist(), index=df[0],
...                           columns=list('ABC')).reset_index()
>>> df['C'] = pd.to_datetime(df['C'])
>>> df
    0       A       B                          C
0  HK  5328.1  5329.3 2013-12-27 13:58:57.973614
1  HK  5328.1  5329.3 2013-12-27 13:58:59.237387
2  HK  5328.1  5329.3 2013-12-27 13:59:00.346325

read_csv() 文档 中类似我之前使用的内容(pd.read_csv(dtype={'a': str, 'b': list})),但它没有将列表的值按要求放入列中。 - Ewan
这个很有帮助,虽然我在想,在使用Pandas解析之前,是否应该更好地处理一下csv文件(例如将列清理干净)。 - Finger twist
11
@Ewan: 那对你真的有用吗?对我来说,它显示:dtype <class 'list'> not understood - Bikash Gyawali
1
如果你的数据集非常大,使用 eval 可能会导致性能问题。 - Kots

15
df['new_column'] = df['column'].apply(lambda x: ast.literal_eval(x))

只需将上面的代码运行在包含以字符串形式表示的列表的列上即可。


2

根据alko的回答,您可以使用df.apply()函数来读取列表字符串中的实际数据:

 >>> df = pd.read_clipboard(header=None,sep=',')
 >>> df
     0                                                  1
  0  HK  [u'5328.1', u'5329.3', '2013-12-27 13:58:57.97...
  1  HK  [u'5328.1', u'5329.3', '2013-12-27 13:58:59.23...
  2  HK  [u'5328.1', u'5329.3', '2013-12-27 13:59:00.34...
 >>> df[1] = df[1].apply(eval)
 >>> df
     0                                             1
  0  HK  [5328.1, 5329.3, 2013-12-27 13:58:57.973614]
  1  HK  [5328.1, 5329.3, 2013-12-27 13:58:59.237387]
  2  HK  [5328.1, 5329.3, 2013-12-27 13:59:00.346325]

1
请注意,eval 执行包含在这些单元格中的任意 Python 代码,这是一个巨大的安全风险。请参阅:https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html - Swier

1
使用 Python 中的 .strip() 方法。
with open(csvfile, 'r')as infile:
    reader = csv.reader(infile)
    for row in reader:
        col1 = row[0]
        col2 = row[1:].strip("[]")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接