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