Python 选择列的子集而不复制

Python 选择列的子集而不复制,python,pandas,dataframe,indexing,Python,Pandas,Dataframe,Indexing,我希望在不复制数据的情况下从数据框中选择列的子集。从这个角度来看,如果列具有不同的数据类型,那么这似乎是不可能的。有人能证实吗?对我来说,似乎一定有办法,因为这个功能是如此重要 例如,df.loc[:,['a','b']]生成一个副本。这篇文章只适用于所有列中具有相同数据类型的数据帧 如果要选择的列使用.iloc内的切片以规则的步幅彼此分开,则这是可能的。因此,选择任意两列始终是可能的,但是对于两个以上的列,我们需要在它们之间有规则的步幅。在所有这些情况下,我们都需要知道它们的列ID和跨距 让我

我希望在不复制数据的情况下从数据框中选择列的子集。从这个角度来看,如果列具有不同的数据类型,那么这似乎是不可能的。有人能证实吗?对我来说,似乎一定有办法,因为这个功能是如此重要


例如,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开始的三列和两列的跨距

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

如果您引用的示例显示它为真,您是否尝试过它是否有效?我尝试过df.loc示例,并且_is_view设置为false。此外,分配不会传播到原始数据帧。所以,它产生了一个副本。我编辑了这个问题来反映这一点。我闻到一个XY问题。。。您试图在这里实现什么?例如,选择列的子集,然后使用itertuples创建一个列表,作为pyodbc的executemany函数的参数传递。这对于大型数据集来说是一个明显的问题!并不是所有显示糟糕设计的问题都是XY问题。我忘了提到列的数据类型是不同的。我编辑了这个问题。@Konstantin你应该早点提到。不要认为这适用于不同的数据类型。为将来的读者保留这篇文章是为了同一个数据类型的常规情况。我不知道你为什么认为所有的数据类型都是相同的?这是一个非常狭窄的用例。不过,很抱歉浪费了你的时间。