python - 获取 Pandas DataFrame 第一列

标签 python pandas

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

假设简单的数据框:

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

Data frame 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。

最佳答案

使用您的代码:

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 的列表。 在第 4 行,您从该列表中创建了一个数据框,但您指定了索引值和列名(这通常是好的做法)。 数字列名称“0”、“1”...如第一个示例中所示,仅在您未指定列名称时出现,它不是列位置索引器。

如果您想按位置访问列,您可以:

df[df.columns[0]]

接下来会发生什么,您获得 df 的列列表,然后选择术语“0”并将其作为引用传递给 df。

希望能帮助你理解

编辑:

另一种方式(更好)是:

df.iloc[:,0]

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

关于python - 获取 Pandas DataFrame 第一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41954759/

相关文章:

唯一值的python字典计数

python - `mime.hasImage()` 返回 `true`,但 `mime.imageData()` 在 Linux 上返回 `None`

python - Selenium/ChromeDriver 未知政策错误

Python:从一月到当月动态选择列

python - python 中本地主机上的 HTTP 删除请求

python - Keras 函数式 API 有什么特别之处?

python - 绘制按小时和星期几分组的时间序列

python - 如何根据 pandas 中的其他列可视化记录数

python - 如何在Python中绘制数据透视图?

pandas - 围绕标记坐标创建形状多边形