我有一个熊猫数据框df
,其元素每个是整个numpy数组。例如,列'x_grid'
的第六行:
>>> e = df.loc[6,'x_grid']
>>> print(e)
[-11.52616579 -11.48006112 -11.43395646 -11.3878518 -11.34174713
-11.29564247 -11.24953781 -11.20343315 -11.15732848 -11.11122382
-11.06511916 -11.01901449 ...
但是我不能将其用作一个numpy数组,因为它只是作为字符串给出的:
>>> print(type(e))
<class 'str'>
我如何将一个numpy数组存储到一个数据框中,这样它就不会转换为字符串?还是以一种不错的方式将此字符串转换回numpy数组?
答案 0 :(得分:0)
如果您只想将每一行中的所有这些字符串都转换为列表,则可以执行以下操作:
df['x_grid'].str[1:-1].str.split(" ").apply(lambda x: (list(map(float, x))))
# or for a numpy array
df['x_grid'].str[1:-1].str.split(" ").apply(lambda x: (np.array(list(map(float, x)))))
希望有帮助。
答案 1 :(得分:0)
感谢Erfan和hpaulj提出的建议,共同回答了这个问题。
解决方案是,在设置数据帧的元素时,我首先将numpy数组x
转换为列表(因此它是逗号分隔而不是空格分隔):
df = df.append({'x_grid': list(x)}, ignore_index=True)
然后保存到csv中并重新加载后,我使用np.array()
和ast.literal_eval()
将其提取回numpy数组(注意:需要import ast
):
x = np.array(ast.literal_eval(df.loc[entry,'x_grid']))
然后返回正确的numpy数组x
。
答案 2 :(得分:0)
想要扩展Rafal的答案,以避免由x.split
导致的空字符串中出现numpy抛出异常:
df['x_grid'].str[1:-1].apply(lambda x: list(filter(None,x.split(' ')))).apply(lambda x: np.array(x).astype(np.float))