【问题标题】:Pandas dataframe reading numpy array column as strPandas 数据框将 numpy 数组列读取为 str
【发布时间】:2019-07-04 00:10:46
【问题描述】:

我有两个 Python 脚本,一个创建 .csv 文件,另一个读取它。

这就是我将数据框保存在第一个文件中的方式:

df['matrix'] = df['matrix'].apply(lambda x: np.array(x))
df.to_csv("Matrices.csv", sep=",", index=False)

df['matrix'].iloc[0] 的类型和形状分别为<class 'numpy.ndarray'>(24, 60)

在我尝试的第二个脚本中

print ("type of df['matrix'].iloc[0]", type(df['matrix'].iloc[0]))

输出为type of df['matrix'].iloc[0] <class 'str'>

如何确保df['matrix'] 不会失去其本质?

【问题讨论】:

  • csv 是什么样的?它是如何渲染数组对象的?我猜它包括 [],可能由 str(df['matrix'][0] 生成。

标签: python pandas numpy


【解决方案1】:

如果要保存和只读 numpy 数组,请使用 savetxtgenfromtxt


如果有多个列,则使用:

使用pickle:

df.to_pickle('file.pkl')
df = pd.read_pickle('file.pkl')

将数组转换为多列,然后写入文件:

a = np.array(
[[219,220,221],
 [154,152,14],
 [205,202,192]])

df = pd.DataFrame({'matrix':a.tolist(), 'b':np.arange(len(a))})
print (df)
            matrix  b
0  [219, 220, 221]  0
1   [154, 152, 14]  1
2  [205, 202, 192]  2

df1 = pd.DataFrame(df.pop('matrix').values.tolist(), index=df.index).add_prefix('mat_')
print (df1)
   mat_0  mat_1  mat_2
0    219    220    221
1    154    152     14
2    205    202    192

df = df.join(df1)
print (df)
   b  mat_0  mat_1  mat_2
0  0    219    220    221
1  1    154    152     14
2  2    205    202    192

但如果真的需要将值转换为array 需要转换器与ast.literal_eval:

import ast

df.to_csv('testing.csv', index=False)

df = pd.read_csv('testing.csv', converters={'matrix':lambda x: np.array(ast.literal_eval(x))})
print (type(df.loc[0, 'matrix']))

<class 'numpy.ndarray'>

【讨论】:

  • 我最初使用的是 np.array(list(map(literal_eval, df['matrix']))) 但我的 Python 解释器在处理完整数据集时崩溃了。还有其他选择吗?
  • @yaminigoel - df.to_pickle(file)df = pd.read_pickle(file) 怎么样?
  • 我不知道pickle 的功能。 .csv 可以正常工作吗?当我尝试 df.to_pickle("Matrices.csv") 时,我的脚本崩溃了
  • @yaminigoel - 什么是错误?因为to_csv 总是丢失数据类型,所以所有数据总是转换为字符串。然后read_csv只区分float和int列,另外一个转成字符串。
【解决方案2】:

要将数组作为多列直接保存到 csv,请使用:

np.savetxt(r'C:\path\file.csv',a,delimiter=',')

如果您需要作为 python 对象回读,@jezrael 指出,ast.literal_eval() 是您的救星

【讨论】:

  • 我最初使用的是np.array(list(map(literal_eval, df['matrix']))),但我的 Python 解释器在处理完整数据集时崩溃了。还有其他选择吗?
猜你喜欢
  • 2013-09-09
  • 2020-06-20
  • 1970-01-01
  • 2016-03-31
  • 2019-02-25
  • 2017-05-12
  • 2022-01-12
  • 2020-02-20
相关资源
最近更新 更多