如何从列表中获取列表?

时间:2018-10-04 13:13:45

标签: python string pandas dataframe split

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

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]']

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

没有外部模块,使用列表理解非常容易:

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(",")]

答案 2 :(得分:0)

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

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

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

np.float == float起,您可以跳过对np.float的转换,只需执行

eval(df[i][j])

答案 3 :(得分:0)

您可以使用ast.literal_eval,我建议您避免链接索引。而是使用pd.DataFrame.at进行快速的标量访问。另请注意,迭代不需要访问pd.DataFrame.columns的列:

from ast import literal_eval

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

如果您需要将其应用于整个系列,则可以使用pd.Series.map或列表理解:

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并非设计为连续保存列表,对于大数据工作流,您可能会遇到这种数据结构的效率和内存问题。