在Pandas中,是否有一种不使用Eval将数据转换为列表的方法?
我有以下的df,我想对列表使用dataframe操作,而不必首先使用eval将列表项转换为列表。
#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=' ')如您所见,类型是对象:
df.a[0]
# "['4','2','6']"
df.a.to_numpy()
# array(["['4','2','6']", "['2','3','7']", "['1','2','8']"], dtype=object)我如何使用熊猫,这些对象转换为列表而不是字符串的列表?
我可以遍历这些项,并使用eval手动创建列表:
eval(df.a[0])
['4', '2', '6']但是我想让dataframe拥有列表的对象,而不是列表的字符串。这有可能吗?若要将列表字符串转换为dataframe对象中的实际列表,请执行以下操作?
发布于 2019-11-20 21:09:09
在转换器参数中使用评估:
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)输出
a b
0 [1, 2, 5] [2]
1 [2, 3, 4] [4]
2 [2, 3, 4] []
3 [] []如果您担心eval的危险,您可以将ast.literal_eval视为一个安全替代。
发布于 2019-11-20 21:12:10
如果不想使用eval的任何变化,可以在每一列上使用str.strip和str.split。但是,与使用eval相比,我不知道这种方法有多高的效率
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: objectNote:这只是另一个想法。如果您的字符串有一些空白或一些不同的字符,则很难处理。我个人仍然更喜欢使用eval或ast.literal_eval。
https://stackoverflow.com/questions/58963336
复制相似问题