首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Pandas中,是否有一种不使用Eval将数据转换为列表的方法?

在Pandas中,是否有一种不使用Eval将数据转换为列表的方法?
EN

Stack Overflow用户
提问于 2019-11-20 21:03:18
回答 2查看 599关注 0票数 3

在Pandas中,是否有一种不使用Eval将数据转换为列表的方法?

我有以下的df,我想对列表使用dataframe操作,而不必首先使用eval将列表项转换为列表。

代码语言:javascript
复制
#a b
#['4','2','6']
#['2','3','7']
#['1','2','8']

dff="""a
['4','2','6']
['2','3','7']
['1','2','8']"""


csvfile = io.StringIO("a b\n0 ['1','2','5'] ['2']\n1 ['2','3','4'] ['4']\n2 ['2','3','4'] []\n3 [] []\n")
df = pd.read_csv(csvfile, sep=' ')

如您所见,类型是对象:

代码语言:javascript
复制
df.a[0]                                                                                                                                                                                         
# "['4','2','6']"

df.a.to_numpy()                                                                                                                                                                                 
# array(["['4','2','6']", "['2','3','7']", "['1','2','8']"], dtype=object)

我如何使用熊猫,这些对象转换为列表而不是字符串的列表?

我可以遍历这些项,并使用eval手动创建列表:

代码语言:javascript
复制
eval(df.a[0])
['4', '2', '6']

但是我想让dataframe拥有列表的对象,而不是列表的字符串。这有可能吗?若要将列表字符串转换为dataframe对象中的实际列表,请执行以下操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-20 21:09:09

在转换器参数中使用评估

代码语言:javascript
复制
csvfile = io.StringIO("a b\n0 ['1','2','5'] ['2']\n1 ['2','3','4'] ['4']\n2 ['2','3','4'] []\n3 [] []\n")
df = pd.read_csv(csvfile, sep=' ', converters={'a' : ast.literal_eval, 'b' : ast.literal_eval })
print(df)

输出

代码语言:javascript
复制
           a    b
0  [1, 2, 5]  [2]
1  [2, 3, 4]  [4]
2  [2, 3, 4]   []
3         []   []

如果您担心eval的危险,您可以将ast.literal_eval视为一个安全替代

票数 1
EN

Stack Overflow用户

发布于 2019-11-20 21:12:10

如果不想使用eval的任何变化,可以在每一列上使用str.stripstr.split。但是,与使用eval相比,我不知道这种方法有多高的效率

代码语言:javascript
复制
df.a.str.strip('[]').str.split()

Out[363]:
0    ['1','2','5']
1    ['2','3','4']
2    ['2','3','4']
3               []
Name: a, dtype: object

df.a.str.strip('[]').str.split().map(type)

Out[364]:
0    <class 'list'>
1    <class 'list'>
2    <class 'list'>
3    <class 'list'>
Name: a, dtype: object

Note:这只是另一个想法。如果您的字符串有一些空白或一些不同的字符,则很难处理。我个人仍然更喜欢使用evalast.literal_eval

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58963336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档