将颜色的字符串表示形式转换回列表

时间:2019-07-14 22:24:53

标签: python pandas csv literals

我有一个数据,其中一列是数字列表,但是当保存为CSV时,我猜想它是作为字符串存储的。 我想将此字符串列表转换回列表列表。

所以这是我现在的数据:

import pandas as pd 
from ast import literal_eval

colors = ["(120, 120, 80)", "(90, 10, 100)"]
names = ["name1", "name2"]
data = {
    "colors":colors,
    "names":names
}
df = pd.DataFrame(data)

从阅读Stackoverflow之后,我尝试使用文字eval方法,但该方法无效:

try:
  df['colors'] = literal_eval( df['colors'].tolist() )
except ValueError as e:
  print(e)

我收到格式错误的字符串错误。

3 个答案:

答案 0 :(得分:1)

您可以为每个列执行以下操作:

col = [int(val) for val in colors.replace("(","").replace(")","").split(",")]

答案 1 :(得分:1)

使用literal_eval()是一个好方法。问题在于它需要分别应用于每个子列表(字符串)。 pythonic方法将使用列表理解,如下所示:

>>> from ast import literal_eval
>>> colors = ["(120, 120, 80)", "(90, 10, 100)"]
>>> colors = [literal_eval(x) for x in colors]
>>> colors
[(120, 120, 80), (90, 10, 100)]

要获得list的{​​{1}}而不是list的{​​{1}},可以使用:

list

ast.literal_eval(node_or_string)的Python文档指出:

  

安全地评估表达式节点或包含Python的字符串   文字或容器显示。提供的字符串或节点只能   由以下Python文字结构组成:字符串,字节,   数字,元组,列表,字典,集合,布尔值和无。

     

这可用于安全地评估包含Python的字符串   来自不受信任来源的值,而无需解析值   自己。它不能评估任意复杂   表达式,例如涉及运算符或索引。

答案 2 :(得分:1)

使用(6.4, 4.8)提取数字,然后使用// ES5 - Accepts either an array or a variable number of arguments function sutSplit(string, delimiters) { delimiters = (Array.isArray(delimiters) ? delimiters : Array.from(arguments).slice(1)).reverse(); const splits = string.split(delimiters.pop()); for (let delimiter of delimiters) { for (let index = splits.length - 1; index >= 0; index--) { const split = splits[index].split(delimiter); if (split.length > 1) { splits.splice(index, 1, ...split); } } } return splits; } 提取序列:

re.findall