使用Python将“类字符串”列表转换为整数

5

在检索了一些数据之后,我的dataframe的一些行由“类似字符串”的列表组成,就像这个样子:

       bar                foo
   0     'A'                1
   1     'B'                2
   2     'B'     "['2' ,'3']"
   3     'B'              '4'
   4     'C'     "['5' ,'3']"

我如何将 foo 列转换为整数值并使用 pythonpandas 计算较大的值?

那不是一个“类似字符串”的列表。那是一个字符串 - juanpa.arrivillaga
3个回答

3

literal_eval

from ast import literal_eval

df.foo.map(literal_eval).explode().max(level=0)

0    1
1    2
2    3
3    4
4    5
Name: foo, dtype: object

然而,如果有些元素已经是非字符串对象。
from ast import literal_eval

def l_eval(x):
    try:
        return literal_eval(x)
    except ValueError as e:
        return x

df.foo.map(l_eval).explode().max(level=0)

2
不太对 - 这让他们完成了一半,但他们也想要 max() - ti7
1
@ti7 谢谢,已修复。 - piRSquared
这个方法在我的终端中抛出以下错误信息: Traceback (most recent call last): File "../lib/python3.9/ast.py", line 50, in parse return compile(source, filename, mode, flags, File "<unknown>", line 1 2; 1 ^ SyntaxError: invalid syntax这是 ast.py 文件的问题吗? - Rodrigo Vargas
2
不,我不这么认为。几乎可以肯定的是,您传递的值之一不是有效的Python文字。 - piRSquared

3

您可以使用literal_eval转换foo列,然后如果元素是列表,则获取max

import pandas as pd
from ast import literal_eval

...

df.foo = df.foo.map(lambda x: literal_eval(str(x)))
"""
  bar     foo
0   A       1
1   B       2
2   B  [2, 3]
3   B       4
4   C  [5, 3]
"""

df.foo = df.foo.map(lambda x: max(x) if isinstance(x, list) else x)
"""
  bar foo
0   A   1
1   B   2
2   B   3
3   B   4
4   C   5
"""

def get_max(item):
    item = literal_eval(str(item))
    return max(item) if isinstance(item, list) else item

df.foo = df.foo.map(get_max)

2

警告。这有点需要手动操作;

df['foo']=df['foo'].str.strip("''")#Strip ''
df['foo']=np.where(df['foo'].str.contains('\['),df['foo'].str.findall('(?<=\"\[\')\d(?=\'\,)|(?<=\')\d(?=\'\]\")'),df['foo'])# Extract digits sandwitched between special characters
df['foo']=df['foo'].explode().max(level = 0)



  bar foo
0  'A'   1
1  'B'   2
2  'B'   3
3  'B'   4
4  'C'   5

1
我不得不深入挖掘错误,但最终解决了。 最终的代码片段是这样的: df['foo']=df['foo'].explode().max(level = 0)#将数据框展开 - Rodrigo Vargas
谢谢,这是我的愚蠢错误。它不能是一个元组。已编辑。 - wwnde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接