将带有列的大熊猫DF列到文件中,如何将其读回?

时间:2019-10-26 06:30:17

标签: python pandas

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

    c1    c2

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

1  "sdf"  ["el1", "el3", "el5"]

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

我该如何规避?如何整洁地读写熊猫数据框的列表列?

2 个答案:

答案 0 :(得分:2)

您可以使用ast.literal_eval转换列表填充的列:

import ast

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

另一个想法是在read_csv中将converters与lambda函数一起使用,并使用ast.literal_eval

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,则始终会转换为字符串,为避免可能使用其他格式,例如腌制并与DataFrame.to_pickle一起使用read_pickle

df.to_pickle('file.pkl')

df = pd.read_pickle('file.pkl')
print (df)
    c1               c2
0  asd       [el1, el2]
1  sdf  [el1, el3, el5]

答案 1 :(得分:0)

您可以使用<!DOCTYPE html> <html lang="en"> <head> <?= $this->element('Fronts/head') ?> </head> <body> <?= $this->element('Fronts/header') ?> <!-- Page Content --> <div id="content" class="container"> <?= $this->Flash->render() ?> <div class="row"> <?= ($this->request->getParam('action') == 'index') ? 'LIST' : strtoupper($this->request->getParam('action')); ?> <?= $this->fetch('content') ?> </div> </div> <?= $this->element('Fronts/footer') ?> </body> </html> 除去括号,然后在逗号前使用.strip("[]")

.split()

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