我有一个数据,其中一列是数字列表,但是当保存为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)
我收到格式错误的字符串错误。
答案 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