【问题标题】:Convert string representation of colors back to list将颜色的字符串表示形式转换回列表
【发布时间】:2019-07-14 22:24:53
【问题描述】:

我有数据,其中一列是数字列表,但是当保存到 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)

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

【问题讨论】:

  • @Dan 来自ast.literal_eval(node_or_string) 上的 Python 文档:“安全地评估表达式节点或包含 Python 文字或容器显示的字符串。提供的字符串或节点可能仅包含以下 Python 文字结构: 字符串、字节、数字、元组、列表、字典、集合、布尔值和无。这可用于安全地评估包含来自不受信任来源的 Python 值的字符串,而无需自己解析值。它不能任意评估复杂的表达式,例如涉及运算符或索引。"
  • @ChristopherPeisert 感谢您提供的信息!
  • [[int(channel) for channel in re.findall(r'\d+', color)] for color in colors]

标签: python pandas csv literals


【解决方案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)]

要获得listlist 而不是tuplelist,您可以使用:

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

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

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

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

【讨论】:

    【解决方案2】:

    你可以为每一列做这样的事情:

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

    【讨论】:

      【解决方案3】:

      使用re.findall 提取数字并在系列上使用apply

      import re
      df['colors'].apply(lambda str : [int(s) for s in re.findall(r'\d+',str) ]).tolist()
      
      #  [[120, 120, 80], [90, 10, 100]]
      

      【讨论】:

        猜你喜欢
        • 2017-11-24
        • 2018-03-27
        • 1970-01-01
        • 2021-04-13
        相关资源
        最近更新 更多