gpt4 book ai didi

python - 在不复制的情况下选择列的子集

转载 作者:行者123 更新时间:2023-11-28 17:10:57 25 4
gpt4 key购买 nike

我想从 DataFrame 中选择列的子集而不复制数据。来自 this answer如果列具有不同的数据类型,这似乎是不可能的。有人可以确认吗?对我来说,似乎必须有一种方法,因为该功能是如此重要。

例如,df.loc[:, ['a', 'b']] 生成一个副本。

最佳答案

这篇文章仅适用于所有列具有相同数据类型的数据框。

如果要选择的列使用 .iloc 中的切片彼此之间有规律的步幅,则这是可能的。因此,始终可以选择任意两列,但对于多于两列,我们需要在它们之间有规律的步幅。在所有这些情况下,我们都需要知道它们的列 ID 和步幅。

让我们尝试借助一些示例案例来理解这些内容。

案例 #1:两列从第 0 列 ID 开始

In [47]: df1
Out[47]:
a b c d
0 5 0 3 3
1 7 3 5 2
2 4 7 6 8

In [48]: np.array_equal(df1.loc[:, ['a', 'b']], df1.iloc[:,0:2])
Out[48]: True

In [50]: np.shares_memory(df1, df1.iloc[:,0:2]) # confirm view
Out[50]: True

案例 #2:从第一个列 ID 开始的两列

In [51]: df2
Out[51]:
a0 a a1 a2 b c d
0 8 1 6 7 7 8 1
1 5 8 4 3 0 3 5
2 0 2 3 8 1 3 3

In [52]: np.array_equal(df2.loc[:, ['a', 'b']], df2.iloc[:,1::3])
Out[52]: True

In [54]: np.shares_memory(df2, df2.iloc[:,1::3]) # confirm view
Out[54]: True

案例 #2:三列从第一个列 ID 开始,步幅为 2 列

In [74]: df3
Out[74]:
a0 a a1 b b1 c c1 d d1
0 3 7 0 1 0 4 7 3 2
1 7 2 0 0 4 5 5 6 8
2 4 1 4 8 1 1 7 3 6

In [75]: np.array_equal(df3.loc[:, ['a', 'b', 'c']], df3.iloc[:,1:6:2])
Out[75]: True

In [76]: np.shares_memory(df3, df3.iloc[:,1:6:2]) # confirm view
Out[76]: True

选择 4 列:

In [77]: np.array_equal(df3.loc[:, ['a', 'b', 'c', 'd']], df3.iloc[:,1:8:2])
Out[77]: True

In [78]: np.shares_memory(df3, df3.iloc[:,1:8:2])
Out[78]: True

关于python - 在不复制的情况下选择列的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com