按位置选择pandas列

155

我只是想通过整数访问命名的pandas列。

您可以使用df.ix [3]按位置选择行。

但是如何通过整数选择列?

我的数据框:

df=pandas.DataFrame({'a':np.random.rand(5), 'b':np.random.rand(5)})

更新以提问。 - Jason Strimpel
在这个例子中,列的顺序可能没有被定义。('a' 可能是第一列或第二列)。 - user48956
7个回答

232

我能想到的两种方法:

>>> df
          A         B         C         D
0  0.424634  1.716633  0.282734  2.086944
1 -1.325816  2.056277  2.583704 -0.776403
2  1.457809 -0.407279 -1.560583 -1.316246
3 -0.757134 -1.321025  1.325853 -2.513373
4  1.366180 -1.265185 -2.184617  0.881514
>>> df.iloc[:, 2]
0    0.282734
1    2.583704
2   -1.560583
3    1.325853
4   -2.184617
Name: C
>>> df[df.columns[2]]
0    0.282734
1    2.583704
2   -1.560583
3    1.325853
4   -2.184617
Name: C

编辑:原回答建议使用 df.ix[:,2],但现在该函数已被弃用。用户应切换到 df.iloc[:,2]


31
了解,df.ix现在已被df.iloc替代。 - yosemite_k
请注意,如果您有两列具有相同名称,则df.iloc [:,2]方法有效,仅返回一列,但是df [df.columns [2]]方法将返回具有相同名称的两列。 - BobbyG
正如BobbyG所说,在出现重复列名的情况下,df.columns[2]然后df[df.columns[2]]将返回所有该名称的列,并且是一个数据框,而不是系列对象。 - Uwe Mayer

66

您也可以使用df.icol(n)按整数访问列。

更新: icol已被弃用,相同的功能现在可通过以下方式实现:

df.iloc[:, n]  # to access the column at the nth position

4
请注意,对于即将发布的版本0.11.0,这些方法已被弃用并可能在未来的版本中被移除。请参阅http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-integer 以了解如何使用iloc/iat按位置进行选择。 - Wouter Overmeire
1
上面的链接已经废弃,因为索引文档已被重新构建: http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-position。截至今天,最新版本为0.21.0,使用 iloc 访问列仍然是官方文档推荐的方法。 - iff_or
如何通过列号列表进行选择? - thistleknot

28
你可以使用 .loc 或 .iloc 方法进行基于标签或索引的列切片,包括列范围:
In [50]: import pandas as pd

In [51]: import numpy as np

In [52]: df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))

In [53]: df
Out[53]: 
          a         b         c         d
0  0.806811  0.187630  0.978159  0.317261
1  0.738792  0.862661  0.580592  0.010177
2  0.224633  0.342579  0.214512  0.375147
3  0.875262  0.151867  0.071244  0.893735

In [54]: df.loc[:, ["a", "b", "d"]] ### Selective columns based slicing
Out[54]: 
          a         b         d
0  0.806811  0.187630  0.317261
1  0.738792  0.862661  0.010177
2  0.224633  0.342579  0.375147
3  0.875262  0.151867  0.893735

In [55]: df.loc[:, "a":"c"] ### Selective label based column ranges slicing
Out[55]: 
          a         b         c
0  0.806811  0.187630  0.978159
1  0.738792  0.862661  0.580592
2  0.224633  0.342579  0.214512
3  0.875262  0.151867  0.071244

In [56]: df.iloc[:, 0:3] ### Selective index based column ranges slicing
Out[56]: 
          a         b         c
0  0.806811  0.187630  0.978159
1  0.738792  0.862661  0.580592
2  0.224633  0.342579  0.214512
3  0.875262  0.151867  0.071244

9
您可以通过将列索引列表传递给dataFrame.ix来访问多个列。
例如:
>>> df = pandas.DataFrame({
             'a': np.random.rand(5),
             'b': np.random.rand(5),
             'c': np.random.rand(5),
             'd': np.random.rand(5)
         })

>>> df
          a         b         c         d
0  0.705718  0.414073  0.007040  0.889579
1  0.198005  0.520747  0.827818  0.366271
2  0.974552  0.667484  0.056246  0.524306
3  0.512126  0.775926  0.837896  0.955200
4  0.793203  0.686405  0.401596  0.544421

>>> df.ix[:,[1,3]]
          b         d
0  0.414073  0.889579
1  0.520747  0.366271
2  0.667484  0.524306
3  0.775926  0.955200
4  0.686405  0.544421

1
我发现 df.iloc[:,[1,3]] 也可以运行。 - KBurchfiel

4

大多数人已经回答了如何从索引开始获取列的问题。但是在某些情况下,您可能需要从中间或特定索引选择列,这时可以使用以下解决方案。

假设您有列 A,BC。如果您只需要选择列 AC,则可以使用以下代码。

df = df.iloc[:, [0,2]]

其中0,2表示您只需要选择第一列和第三列。


3
方法.transpose()将列转换为行,行转换为列,因此您甚至可以编写以下内容:
df.transpose().ix[3]

3
转置可能会影响数据类型。 - IanS

0

您可以使用方法 take。例如,选择第一列和最后一列:

df.take([0, -1], axis=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接