【问题标题】:turn "string-like" list into int with python [duplicate]使用python将“类似字符串”的列表转换为int [重复]
【发布时间】:2021-06-19 13:38:45
【问题描述】:

检索一些数据后,我的dataframe 的某些行由“类似字符串”的列表组成,如下所示:

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

如何将foo 列转换为int 值并使用python pandas 获取更大的值?

【问题讨论】:

  • 这不是一个“类似字符串”的列表。那是一个字符串

标签: python pandas


【解决方案1】:

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)

【讨论】:

  • 不完全——这让他们半途而废,但他们也想要max()
  • @ti7 thx,已修复
  • 此方法在我的终端中引发以下错误消息: Traceback (last recent call last): File "../lib/python3.9/ast.py", line 50, in parse return compile (source, filename, mode, flags, File "", line 1 2; 1 ^ SyntaxError: invalid syntax 应该是 ast.py 文件的问题吗?
  • 不,我不这么认为。几乎可以肯定的是,您传递的其中一个值不是有效的 python 文字。
【解决方案2】:

您可以使用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)

【讨论】:

    【解决方案3】:

    警告。这有点像手册;

    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
    

    【讨论】:

    • 我不得不深入研究错误,但最终成功了。最终的 sn-p 以这种方式工作: df['foo']=df['foo'].explode().max(level = 0)#Explode dataframe
    • 谢谢,这是我犯的愚蠢错误。它不能是一个元组。已编辑
    猜你喜欢
    • 2014-06-16
    • 2021-12-25
    • 2019-05-18
    • 2019-10-23
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多