获取Pandas DataFrame第一栏

Bob*_*esh 6 python pandas

这个问题很奇怪,因为我知道如何做某事,但是我不知道为什么我不能以另一种方式做。

假设简单的数据帧:

import pandasas pd
a = pd.DataFrame([[0,1], [2,3]])
Run Code Online (Sandbox Code Playgroud)

我可以很容易地对该数据帧进行切片,第一列是a[[0]],第二列是a[[1]]。简单不是吗?

现在,让我们拥有更复杂的数据框架。这是我的代码的一部分:

var_vec = [i for i in range(100)]
num_of_sites = 100
row_names = ["_".join(["loc", str(i)]) for i in 
             range(1,num_of_sites + 1)]
frame = pd.DataFrame(var_vec, columns = ["Variable"], index = row_names)
spec_ab = [i**3 for i in range(100)]
frame[1] = spec_ab
Run Code Online (Sandbox Code Playgroud)

数据框frame也是熊猫DataFrame,例如一个。我可以很容易地获得第二栏frame[[1]]。但是当我尝试时frame[[0]]出现错误:

Traceback (most recent call last):

  File "<ipython-input-55-0c56ffb47d0d>", line 1, in <module>
    frame[[0]]

  File "C:\Users\Robert\Desktop\Záloha\WinPython-64bit-3.5.2.2\python-    3.5.2.amd64\lib\site-packages\pandas\core\frame.py", line 1991, in __getitem__
    return self._getitem_array(key)

  File "C:\Users\Robert\Desktop\Záloha\WinPython-64bit-3.5.2.2\python-    3.5.2.amd64\lib\site-packages\pandas\core\frame.py", line 2035, in     _getitem_array
    indexer = self.ix._convert_to_indexer(key, axis=1)

  File "C:\Users\Robert\Desktop\Záloha\WinPython-64bit-3.5.2.2\python-    3.5.2.amd64\lib\site-packages\pandas\core\indexing.py", line 1184, in     _convert_to_indexer
    indexer = labels._convert_list_indexer(objarr, kind=self.name)

  File "C:\Users\Robert\Desktop\Záloha\WinPython-64bit-3.5.2.2\python-    3.5.2.amd64\lib\site-packages\pandas\indexes\base.py", line 1112, in     _convert_list_indexer
    return maybe_convert_indices(indexer, len(self))

  File "C:\Users\Robert\Desktop\Záloha\WinPython-64bit-3.5.2.2\python-    3.5.2.amd64\lib\site-packages\pandas\core\indexing.py", line 1856, in     maybe_convert_indices
    raise IndexError("indices are out-of-bounds")

IndexError: indices are out-of-bounds
Run Code Online (Sandbox Code Playgroud)

我仍然可以使用,frame.iloc[:,0]但问题是我不明白为什么我不能使用简单切片方式[[]]?我可以使用winpython spyder 3。

epa*_*aro 8

使用您的代码:

import pandas as pd

var_vec = [i for i in range(100)]
num_of_sites = 100
row_names = ["_".join(["loc", str(i)]) for i in 
             range(1,num_of_sites + 1)]
frame = pd.DataFrame(var_vec, columns = ["Variable"], index = row_names)
spec_ab = [i**3 for i in range(100)]
frame[1] = spec_ab
Run Code Online (Sandbox Code Playgroud)

如果您要求打印出“框架”,则会得到:

    Variable    1
loc_1   0       0
loc_2   1       1
loc_3   2       8
loc_4   3       27
loc_5   4       64
loc_6   5       125
......
Run Code Online (Sandbox Code Playgroud)

因此,导致问题的原因变得显而易见,因为没有名为“ 0”的列。在第一行,您指定一个名为var_vec的列表。在第4行,从该列表中创建一个数据框,但是指定索引值和列名(通常是一种好习惯)。如第一个示例中那样,数字列名'0','1'..仅在不指定列名而不是列位置索引器时才发生。

如果要按列位置访问列,则可以:

df[df.columns[0]]
Run Code Online (Sandbox Code Playgroud)

发生的事情是获取df的列列表,然后选择术语“ 0”并将其传递给df作为参考。

希望可以帮助您了解

编辑:

另一种方法(更好)是:

df.iloc[:,0]
Run Code Online (Sandbox Code Playgroud)

其中“:”代表所有行。(也按从0到行范围的数字索引)

  • 另一个选择是:`df.iloc [:, 0]`。 (3认同)