【问题标题】:convert numpy array of tuples to 2D array将元组的numpy数组转换为二维数组
【发布时间】:2020-04-14 02:18:20
【问题描述】:

我有一个 pandas DataFrame,其中一列是由浮点数组成的。当我使用arr = df['col_name'].to_numpy() 时,我最终得到一个元组的一维数组,但我需要一个浮点数的二维数组。

到目前为止,我的解决方案是使用arr = np.array(df['col_name'].to_list())。这可行,但是先转换为列表然后再转换为数组似乎效率低下。所以我想知道,有没有更好的方法来做到这一点?

This question 是相关的,但唯一的答案指向以不同的方式读取文本文件,这对我来说不是一个选项,因为数据已经在 DataFrame 中。

【问题讨论】:

  • 是dtype对象吗? tolist 步骤可能很快。另一种可能是vstack
  • 是的,df['col_name'].dtypearr.dtype 都返回 dtype('O')。所以我应该坚持目前的做法?
  • 一个对象数组使用引用/指针,就像 python 列表一样。熊猫对象 dtype 系列也是。所以to_list 应该很快。

标签: python pandas numpy tuples numpy-ndarray


【解决方案1】:

如果您的 col_name 包含 actual 元组,则运行:

pd.DataFrame(df['col_name'].apply(pd.Series))

但是,如果您已经阅读过您的 DataFrame,例如从 CSV 文件,然后每个 col_name 的元素实际上包含一个 string 组成:

  • 左括号,
  • 一串数字(写成字符串),用逗号分隔,
  • 右括号,

它只是看起来像一个元组。

如果是这种情况,请运行:

pd.DataFrame(df['col_name'].apply(lambda txt: pd.Series(eval(txt))))

在这两种情况下,结果都是一个 DataFrame。如果需要,将其转换为 一个 Numpy 数组。

检查 col_name 是否包含 strings 或 实际的 元组,使用 Jupyter,运行:

df.col_name.iloc[0]

如果结果是'(2.15, 3.03, 4.07)'(用引号括起来)它是 字符串。但是,如果您收到 (2.15, 3.03, 4.07)(不带引号),那就是 元组

另一种检查方法是运行type(df.col_name.iloc[0])。 你应该得到 tuplestr

【讨论】:

  • 谢谢,它有效(我有实际的元组)。因此,要获得 numpy 数组,最终调用将是 pd.DataFrame(df['col_name'].apply(pd.Series)).to_numpy()。对我来说,这看起来比我目前的方法可读性差,但我想好处在于效率,因为它跳过了到列表的转换,对吧?
  • pandas apply 操作通常很慢,因为它实际上是一个行迭代器。此操作正在制作一个新的数据框。 timeit 确定。
  • 我同意@hpaulj,这完全没有必要。当 OP 关心.to_list() 的性能时,情况更是如此。
猜你喜欢
  • 2023-02-03
  • 2018-11-30
  • 2015-12-02
  • 2012-09-16
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多