【发布时间】:2021-09-25 17:31:30
【问题描述】:
我有一个包含几种不同类型的数据框。例如:
df = pd.DataFrame({'A': ['A', 'B', 'C', 'D'],
'B': np.random.randint(10, size=4),
'C': np.random.randint(10, size=4),
'D': np.random.rand(4),
'E': np.random.rand(4)})
数据类型是
>>> df.dtypes
A object
B int32
C int32
D float64
E float64
dtype: object
我希望能够直接从df 的第三行中提取 dtype np.int32 的 numpy 数组中的 B 和 C 的值。看起来很简单:
>>> df.iloc[2][['B', 'C']].to_numpy()
array([9, 9], dtype=object)
这与Series是object类型的事实一致:
>>> df.iloc[2]
A C
B 9
C 9
D 0.211487
E 0.857848
Name: 2, dtype: object
所以也许我不应该先获得该行:
>>> df.loc[df.index[2], ['B', 'C']].to_numpy()
array([9, 9], dtype=object)
仍然没有运气。当然,我总是可以后期处理并做
df.loc[df.index[2], ['B', 'C']].to_numpy().astype(np.int32)
但是,有没有一种方法可以仅使用索引将一组具有相同 dtype 的列与其本机 dtype 提取到一个 numpy 数组中?
【问题讨论】:
-
我从没想过这个问题,因为我已经习惯了索引链接(你的 V1 答案)。 V2 对我来说是新的。
-
@MichaelSzczesny。我机器上的新版 Spyder 有一些不错的自动完成功能。不能说我真的为那个做了研究。问题是我一开始的方向错了。
-
我想这与 numpy 如何将 dtypes 存储在数组中的事实有关,如果我们使用
iloc并使用索引而不是系列获取数据帧,我们会看到预期的行为,因为使用熊猫:df.iloc[[2],df.columns.get_indexer(['B','C'])].dtypes -
@anky。基本上,一个系列是一个单一的数组,所以必须支持通用数据类型。您可能不需要索引器,序列
[2]是它成为 df 的原因。 -
@anky。我误读了。前几次不明白索引器是什么。我的错。