提取numpy array类型的pandas数组的元素

时间:2019-04-04 15:39:47

标签: python arrays pandas numpy

我有一个熊猫数据框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数组?

3 个答案:

答案 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)

感谢Erfanhpaulj提出的建议,共同回答了这个问题。

解决方案是,在设置数据帧的元素时,我首先将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))