假设我有一个数据框,其中的一个列由列表填充,如下所示:
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", "]"
。
我该如何规避?如何整洁地读写熊猫数据框的列表列?
答案 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()
我不确定是否有更好的通用方法来处理熊猫中的可变长度列表。