这个问题很奇怪,因为我知道如何做某事,但我不知道为什么我不能这样做。
假设简单的数据框:
import pandasas pd
a = pd.DataFrame([[0,1], [2,3]])
我可以非常轻松地对此数据框进行切片,第一列为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
数据框frame
也是pandas DataFrame,例如a。我很容易将第二列作为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
我仍然可以使用frame.iloc[:,0]
,但问题是我不明白为什么我不能使用[[]]
的简单切片?如果有帮助,我会使用winpython spyder 3.
答案 0 :(得分:6)
使用您的代码:
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
如果你要打印出“框架”,你会得到:
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
......
因此问题的原因变得明显,你没有名为'0'的列。 在第一行,您指定一个名为var_vec的lista。 在第4行,您可以从该列表中创建一个数据框,但是您可以指定索引值和列名称(通常这是一种很好的做法)。 第一个示例中的数字列名称“0”,“1”,...仅在您未指定列名时发生,而不是列位置索引器。
如果您想按位置访问列,您可以:
df[df.columns[0]]
会发生什么,是否获得了df列的列表,并选择了术语“0”并将其作为参考传递给df。
希望能帮助您理解
编辑:
另一种方式(更好)将是:
df.iloc[:,0]
其中“:”代表所有行。 (也用从0到行范围的数字索引)