【问题标题】:Pandas df.to_records() returns a 1d numpy arrayPandas df.to_records() 返回一个 1d numpy 数组
【发布时间】:2015-07-02 04:36:25
【问题描述】:

如果这个问题看起来有点幼稚,我提前道歉。我还在学习 pandas 和 numpy 之间的相互作用。

我有一个 pandas DataFrame,我正在尝试将其转换为数组以使用 scikit-learn 进行分析。我试过 df.values 和 df.to_records() 来转换它,但由于某种原因,它在转换过程中改变了形状。

这是 Pandas 中 DataFrame (df) 的前几行。

Index           Code1    Code2       Code3
0               99285    5921         5921
1               99284     NaN         5921
2               99284     NaN         4660
3               99285   42789        42789
4               99284   92321        92321
5               99283     NaN        92321
...
[94 rows x 3 columns]

但是,如果我调用df.values,我会得到以下结果,据我所知,它不是数组,因为数组是元组列表。

[['99285' '5921' '5921']
['99284' nan '5921']
['99284' nan '4660']
['99285' '42789' '42789']
['99284' '92321' '92321']
['99283' nan '92321']
...

如果我调用df.to_records(),我会得到以下结果,它是一个数组,但形状不正确,如下所示。

[(0, '99285', '5921', '5921') (1, '99284', nan, '5921')
(2, '99284', nan, '4660') (3, '99285', '42789', '42789')
(4, '99284', '92321', '92321') (5, '99283', nan, '92321')
...
>>>df.to_records().shape
(94,)

有人可以帮助我了解我需要做什么才能获得形状为 (94,3) 的数组吗?

重要说明:列都是字符串(并且需要保留为字符串),而不是整数,如果有帮助的话。

【问题讨论】:

  • 不是df.values.shape == (94, 3) ?
  • df.values 确实返回了一个 np 数组,您从哪里得知数组应该是元组列表?
  • type(df.values) 表示它是一个numpy.ndarray
  • @Alexander bumpy 绝对是错误的?你的意思是 numpy ;-)
  • 错字,但可能会出现颠簸...

标签: python arrays numpy pandas dataframe


【解决方案1】:

事实上,df.values 确实返回了 numpy.ndarray。但是,由于它的打印方式,它看起来像一个列表列表。通过type(df.values) 或查看其形状df.values.shape == (93, 4) 进行检查。

但是,df.to_records() 不会返回 numpy.ndarray,而是返回 numpy.core.records.recarray。你可以通过这样做看到它是一个recarray

type(df.to_records())

或者注意到 dtype 看起来很奇怪:

df.to_records().dtype

df.to_records() 的形状仅表示有多少记录,在您的情况下为 94。记录数组的行为与普通的 numpy 数组不同。例如,尝试

df.to_records()['Code1']
df.to_records().code1

【讨论】:

  • 感谢您帮助我了解为什么 to_records 不起作用。这让我更清楚了。
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多