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

标签 python pandas dataframe indexing

我想从 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/

相关文章:

python - MS 项目(*.mpp 文件)到 PowerBi

r - 计算数据子集的统计信息

python - 使用ffmpeg python阅读视频时如何忽略自动旋转?

python - PyQt5 GUI 仅在屏幕关闭并重新打开时更新

python - 启动时 raspbian python 脚本 EOF 错误

python - 给定 3 个变量具有相同的值,将一个值与一行匹配?

r - 在 R 中提取具有唯一 id 变量的一行

python - 使用 Plotly Python 将 X 轴置于 Y 坐标 0

python - Pandas 导入错误 : module 'bottleneck' has no attribute '__version__'

python - 将第 n 行元素存储在列表 panda 数据框中