【问题标题】:Selecting pandas column by location按位置选择熊猫列
【发布时间】:2013-02-03 04:00:03
【问题描述】:

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

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

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

我的数据框:

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

【问题讨论】:

  • 更新为提问。
  • 在这个例子中,列的顺序可能没有被定义。 (“a”可能是第一列或第二列)。

标签: python pandas indexing


【解决方案1】:

想到的两种方法:

>>> 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]

【讨论】:

  • 仅供参考 df.ix 现在替换为 df.iloc
  • 请注意,如果您有两列同名 df.iloc[:,2] 方法有效,则只返回一列,但 df[df.columns[2]] 方法将返回两列同名。
  • 正上方的 BobbyG 正确指出,如果列名 df.columns[2] 重复,则 df[df.columns[2]] 将返回该名称的所有列,并且是一个数据框,而不是系列对象。
【解决方案2】:

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

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

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

【讨论】:

  • 请注意,对于即将发布的 0.11.0 版本,这些方法已被弃用,并且可能在未来的版本中被删除。请参阅pandas.pydata.org/pandas-docs/dev/…,了解如何使用 iloc/iat 按位置进行选择。
  • 以上链接已被弃用,因为索引文档已被重组:pandas.pydata.org/pandas-docs/stable/…。截至今天,最新版本是 0.21.0,iloc 仍然是按位置访问列的记录方法。
  • 如何通过列号列表进行选择?
【解决方案3】:

.transpose() 方法将列转换为行,将行转换为列,因此您甚至可以编写

df.transpose().ix[3]

【讨论】:

  • 转置可能会混淆数据类型。
【解决方案4】:

您可以使用 基于标签的 .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

【讨论】:

    【解决方案5】:

    您可以通过将列索引列表传递给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
    

    【讨论】:

    • 我发现 df.iloc[:,[1,3]] 也可以。
    【解决方案6】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2015-05-28
      • 2018-07-19
      • 2017-10-01
      • 2019-07-13
      • 2019-04-02
      相关资源
      最近更新 更多