Python 在panda系列中拆分不同长度的对象

Python 在panda系列中拆分不同长度的对象,python,pandas,list,object,Python,Pandas,List,Object,这里是Python/熊猫初学者 我有一个熊猫系列(较大df的列),看起来像这样: 0 ['0344010000122413'] 1 ['0344010000132886'] 2 ['0344010000021642'] 3 ['0344010000010731', '034401000

这里是Python/熊猫初学者

我有一个熊猫系列(较大df的列),看起来像这样:

0                                   ['0344010000122413']
1                                   ['0344010000132886']
2                                   ['0344010000021642']
3      ['0344010000010731', '0344010000010732', '0344...
4                                   ['0344010000025264']
Name: NUMPOINTS, Length: 271, dtype: object
每个NUMPPOINT的长度=16。每行的NUMPOINTS数从0到±100不等

如您所见,该系列的数据类型是一个对象。我的目标是将本系列中的每一行转换为实数列表,并将数字转换为整数,但由于数据类型和
['
']
的原因,这无法实现。每行的可变长度使得无法使用某些函数

我使用了
df['NUMPOINTS']=df.NUMPOINTS.apply(lambda x:x[2:-2].split(','))
,但这只适用于具有1个NUMPOINT的行

我使用了
df['NUMPOINTS'].replace(regex=True,inplace=True,to_replace=r'\D',value=r')
函数,但这个函数将对象“粘”在一起。例如,索引3给出:

3      0344010000010731034401000001073203440100000107...
然后转换为整数会产生错误

我使用了这个问题的解决方案,但也没有做到这一点。 我是不是遗漏了什么

编辑: 尝试更新的答案会给我:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-374-5f4f43cc7fc1> in <module>()
      1 from ast import literal_eval
      2 df["NUMPOINTS"] = df["NUMPOINTS"].apply(
----> 3     lambda x: [
      4         int(value) for value in (literal_eval(x) if isinstance(x, str) else x)
      5     ]

2 frames
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-374-5f4f43cc7fc1> in <listcomp>(.0)
      2 df["NUMPOINTS"] = df["NUMPOINTS"].apply(
      3     lambda x: [
----> 4         int(value) for value in (literal_eval(x) if isinstance(x, str) else x)
      5     ]
      6 )

ValueError: invalid literal for int() with base 10: "0344010000010731'"
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1来自ast导入文字\u评估
2 df[“NUMPOINTS”]=df[“NUMPOINTS”]。应用(
---->3λx:[
4 int(value)表示值in(如果是instance(x,str)或else x,则为literal_eval(x)
5     ]
2帧
pandas/_libs/lib.pyx在pandas中。_libs.lib.map_infere()
英寸(.0)
2 df[“NUMPOINTS”]=df[“NUMPOINTS”]。应用(
3λx:[
---->4 int(value)表示值in(如果是instance(x,str)或else x,则为literal_eval(x)
5     ]
6 )
ValueError:以10为基数的int()的文本无效:“034401000010731”

您可以应用
ast.literal\u eval
然后应用
int()
内部列表理解:

从ast导入文字\u评估
df[“NUMPOINTS”]=df[“NUMPOINTS”]。应用(
lambda x:[int(value)表示文字值_eval(x)]
)
打印(df)
印刷品:

NUMPOINTS
0                   [344010000122413]
1                   [344010000132886]
2                   [344010000021642]
3  [344010000010731, 344010000010732]
4                   [344010000025264]

编辑:

如果列中有字符串/列表:

df[“NUMPOINTS”]=df[“NUMPOINTS”]。应用(
λx:[
int(value.strip(“”)表示(如果是实例(x,str)或其他x,则表示文字值(x)中的值)
]
)
打印(df)
您还可以使用
map()
pd.eval()
方法:

df['NUMPOINTS']=df['NUMPOINTS'].map(lambda x: [int(y.lstrip('0').rstrip("'")) for y in (pd.eval(x) if type(x).__name__=='str' else x)])
现在,如果您打印
df
,您将获得:

                            NUMPOINTS
0                   [344010000122413]
1                   [344010000132886]
2                   [344010000021642]
3  [344010000010731, 344010000010732]
4                   [344010000025264]

此解决方案为我提供了以下语法错误:
文件“”,第1行[0 344010000122413]^SyntaxError:无效语法
更新的答案…现在尝试:)感谢您的帮助,但更新的答案为我提供了“文件”,第1行[0 344010000122413]^SyntaxError:无效语法“``更新了我的答案…请检查:)这给了我以下错误:
ValueError:节点或字符串格式错误:
@QB science列中是否有
NaN
值?列中是否有除
[…]
以外的字符串?没有``NaN``但是有些行只有
[…]
@QB science,这应该不是问题。编辑您的问题并将完整的错误回溯放在那里(格式正确)。@QB science更新了我的答案。
                            NUMPOINTS
0                   [344010000122413]
1                   [344010000132886]
2                   [344010000021642]
3  [344010000010731, 344010000010732]
4                   [344010000025264]