在 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) 从文件中读取数据时出现问题