在 pandas/python 中,读取存储为字符串的数组

Posted

技术标签:

【中文标题】在 pandas/python 中,读取存储为字符串的数组【英文标题】:In pandas/python, reading array stored as string 【发布时间】:2014-05-31 22:01:55 【问题描述】:

我有一个 pandas 数据框,其中一列的每个元素都有字符串数组。

所以是这样的。

  col1 col2
0 120  ['abc', 'def']
1 130  ['ghi', 'klm']

现在,当我使用 to_csv 将其存储到 csv 时,它似乎很好。 当我使用 from_csv 读回它时,我似乎读回了它。 但是当我分析每个单元格中的值时,数组是

'[' ''' 'a' 'b' 'c' 等等。 所以本质上它不是将它作为一个数组读取,而是一组字符串。有人可以建议我如何将此字符串转换为数组吗?

我的意思是说数组已经像字符串一样存储了

'[\'abc\',\'def\']'

【问题讨论】:

【参考方案1】:

正如其他问题中提到的,你应该在这里使用literal_eval

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

在行动:

In [11]: df = pd.DataFrame([[120, '[\'abc\',\'def\']'], [130, '[\'ghi\',\'klm\']']], columns=['A', 'B'])

In [12]: df
Out[12]:
     A              B
0  120  ['abc','def']
1  130  ['ghi','klm']

In [13]: df.loc[0, 'B']  # a string
Out[13]: "['abc','def']"

In [14]: df.B = df.B.apply(literal_eval)

In [15]: df.loc[0, 'B']  # now it's a list
Out[15]: ['abc', 'def']

【讨论】:

我能解释一下literal_eval是如何解决上述问题的吗? @HammadHassan 它尝试将字符串解析为 python 对象,类似于 json.loads。 我很确定这比使用 pandas 自己的 split 函数要慢 - 请参阅下面的答案。【参考方案2】:

没关系。

我要做的就是

arr = s[1:-1].split(',')

这去掉了方括号,并将字符串拆分为我想要的数组。

【讨论】:

【参考方案3】:

如果没有 pandas,这是使用 ast 模块的 literal_eval() 的一种方法:

>>> data = "['abc', 'def']"
>>> import ast
>>> a_list = ast.literal_eval(data)
>>> type(a_list)
<class 'list'>
>>> a_list[0]
'abc'

【讨论】:

对于熊猫,你也应该使用literal_eval! @AndyHayden 啊,好吧!没用过熊猫,不知道:) 这正是我想要的。【参考方案4】:

也许尝试使用不同的分隔符值?像这样:

DataFrame.to_csv(filepath, sep=';')

然后阅读

DataFrame.from_csv(filepath, sep=';')

【讨论】:

以上是关于在 pandas/python 中,读取存储为字符串的数组的主要内容,如果未能解决你的问题,请参考以下文章

从阿里巴巴 OSS 中读取一个对象并使用 pandas python 修改它

DataFrame 中的字符串在 Pandas python 中连接

使用 pandas python 将字符串日期转换为列中所有值的数字

使用 pandas Python (pandas.io.parsers.TextFileReader) 从文件中读取数据时出现问题

如何在 pandas python 中将字符串转换为日期时间格式?

读取在java中存储为字符串的xml [重复]