当前位置: 代码迷 >> python >> 如何从列表中获取列表?
  详细解决方案

如何从列表中获取列表?

热度:93   发布时间:2023-07-16 10:01:38.0

我从.csv文件中读取了一个熊猫数据框df 数据框的每个单元格都包含一个类似于以下内容的字符串

for i in df.index:
    for j in df.columns:

df[i][j]
      '[0.109, 0.1455, 0.0, 1.80e-48, 42.070, -14.582]'

我想要一个list ,其值为np.float 我试过了

 df[i][j].split()
'[0.109,',
 '0.145,',
 '0.0,',
 '1.80e-48,',
 '42.070,',
 '-14.582]']

您可以使用ast.literal_eval将字符串解析为浮点数列表:

>>> import ast
>>> ast.literal_eval('[0.109, 0.1455, 0.0, 1.80e-48, 42.070, -14.582]')
[0.109, 0.1455, 0.0, 1.8e-48, 42.07, -14.582]
>>>

没有外部模块,使用列表理解就很容易了:

A = df[i][j]                     '[0.109, 0.1455, 0.0, 1.80e-48, 42.070, -14.582]'
B = A.strip("[]").split(",")      ['0.109', ' 0.1455', ' 0.0', ' 1.80e-48', ' 42.070', ' -14.582']
C = [float(x) for x in B]         [0.109, 0.1455, 0.0, 1.8e-48, 42.07, -14.582]

因此,单线是:

My_list_of_floats = [float(x) for x in df[i][j].strip("[]").split(",")]

您可以使用python eval()函数将字符串转换为python对象,然后转换为np.float对象:

map(np.float, eval(df[i][j]))

这会使字符串首先进入python列表,然后将每个项目强制转换为np.float。

由于np.float == float ,您可以跳过对np.float的转换,然后执行

eval(df[i][j])

您可以使用 ,我建议您避免使用链式索引。 而是使用进行快速标量访问。 另请注意,要迭代不需要访问 :

from ast import literal_eval

for i in df.index:
    for j in df:
        print(literal_eval(df.at[i, j]))

如果需要将其应用于整个系列,则可以使用或列表 :

df['col1'] = df['col1'].map(literal_eval)
df['col1'] = [literal_eval(i) for i in df['col1']]

如果每个列表具有相同数量的项目,我强烈建议您将其分成不同的列以允许向量化功能:

df = df.join(pd.DataFrame(df.pop('col1').map(literal_eval).values.tolist()))

Pandas并非旨在按顺序保存列表,而对于大数据工作流,您可能会遇到这种数据结构的效率和内存问题。

  相关解决方案