【问题标题】:Can't seem to use use pandas to_csv and read_csv to properly read numpy array似乎无法使用 pandas to_csv 和 read_csv 来正确读取 numpy 数组
【发布时间】:2018-06-24 13:42:02
【问题描述】:

问题似乎源于当我尝试在 nparray 上执行操作时读取带有 read_csv 类型问题的 csv。以下是一个最小的工作示例。

x = np.array([0.83151197,0.00444986])
df = pd.DataFrame({'numpy': [x]})
np.array(df['numpy']).mean()

Out[151]: array([ 0.83151197,  0.00444986])

这是我所期望的。但是,如果我将结果写入文件,然后将数据读回 pandas DataFrame,则类型会被破坏。

x = np.array([0.83151197,0.00444986])
df = pd.DataFrame({'numpy': [x]})
df.to_csv('C:/temp/test5.csv')
df5 = pd.read_csv('C:/temp/test5.csv', dtype={'numpy': object})
np.array(df5['numpy']).mean()

TypeError: /: 'str' 和 'long' 的操作数类型不受支持

以下是“df5”对象的输出

df5 
Out[186]:     
    Unnamed: 0                      numpy 
 0           0    [0.83151197  0.00444986]

以下是文件内容:

,numpy
0,[ 0.83151197  0.00444986]

我想出如何让它工作的唯一方法是读取数据并手动转换类型,这看起来很傻而且很慢。

[float(num) for num in df5['numpy'][0][1:-1].split()]

有没有办法避免上述情况?

【问题讨论】:

  • object = 没有转换。类型基本上都是字符串。
  • 您需要 eval 将对象转换为列表
  • @cᴏʟᴅsᴘᴇᴇᴅ 我使用 dtype 作为dtype={'numpy': np.float64} 但得到ValueError: could not convert string to float: [ 0.83151197 0.00444986]
  • 显示文件内容和df5对象。
  • @hpaulj 添加到原始帖子中,以便其他人可以看到。

标签: python-3.x pandas numpy


【解决方案1】:

pd.DataFrame({'col_name': data}) 期望一维数组与 data 类似的对象:

In [63]: pd.DataFrame({'numpy': [0.83151197,0.00444986]})
Out[63]:
      numpy
0  0.831512
1  0.004450

In [64]: pd.DataFrame({'numpy': np.array([0.83151197,0.00444986])})
Out[64]:
      numpy
0  0.831512
1  0.004450

你已经用[] 包裹了 numpy 数组,所以你传递了一个 numpy 数组列表:

In [65]: pd.DataFrame({'numpy': [np.array([0.83151197,0.00444986])]})
Out[65]:
                      numpy
0  [0.83151197, 0.00444986]

df = pd.DataFrame({'numpy': [x]}) 替换为df = pd.DataFrame({'numpy': x})

演示:

In [56]: x = np.array([0.83151197,0.00444986])
    ...: df = pd.DataFrame({'numpy': x})
#                                   ^  ^
    ...: df.to_csv('d:/temp/test5.csv', index=False)
    ...:

In [57]: df5 = pd.read_csv('d:/temp/test5.csv')

In [58]: df5
Out[58]:
      numpy
0  0.831512
1  0.004450

In [59]: df5.dtypes
Out[59]:
numpy    float64
dtype: object

【讨论】:

  • 似乎有同样的问题。
  • 谢谢,但我实际上需要数组。我的数据最终将是file1, [value1,value2, value3, value3] file2, [value4,value4, valur5, value6]。按照您建议的方式进行操作将使计算变得更加困难,因为我最终必须对 value1 和 value4(平均值、标准差等)、value2 和 value4、value3 和 value5 等的值进行统计。
  • @KevinVasko,您的专栏会全部包含列表还是仅包含其中的一部分?
  • @KevinVasko,我不建议您在 Pandas 单元格中存储复杂对象,如列表、字典、集合等 - 您将失去灵活性,并且大多数矢量化函数不适用于此类列。 ..
  • 这是目前唯一包含数组的。
猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2018-12-05
  • 2017-06-21
  • 2014-11-17
相关资源
最近更新 更多