问题描述
我从.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]']
1楼
您可以使用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]
>>>
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(",")]
3楼
您可以使用python eval()
函数将字符串转换为python对象,然后转换为np.float对象:
map(np.float, eval(df[i][j]))
这会使字符串首先进入python列表,然后将每个项目强制转换为np.float。
由于np.float == float
,您可以跳过对np.float的转换,然后执行
eval(df[i][j])
4楼
您可以使用 ,我建议您避免使用链式索引。 而是使用进行快速标量访问。 另请注意,要迭代不需要访问 :
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并非旨在按顺序保存列表,而对于大数据工作流,您可能会遇到这种数据结构的效率和内存问题。