2017-01-31 8 views
1

Этот вопрос странный, так как я знаю, КАК что-то делать, но я не знаю, ПОЧЕМУ я не могу сделать это по-другому.Get Pandas DataFrame первая колонка

Пусть простой кадр данных:

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 также панды 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 

Я все еще могу использовать frame.iloc[:,0], но проблема в том что я не понимаю, почему я не могу использовать простую нарезку по [[]]? Я использую winpython spyder 3, если это помогает.

+3

Он работает в первом DataFrame, потому что один имеет столбец с именем '0'. Это первый столбец, но это не обязательно. Возможно, это был любой другой столбец с этим именем. Поэтому, чтобы использовать то же самое, вам нужно получить доступ по имени ('frame [['Variable']]' при условии, что вы хотите вернуть DataFrame, а не Series). – ayhan

ответ

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' . В строке 1 вы указываете список, называемый var_vec. В строке 4 вы создаете из этого списка данные, но указываете значения индекса и имя столбца (что обычно является хорошей практикой). Имя числового столбца, '0', '1', .. как в первом примере, происходит только тогда, когда вы не укажете имя столбца, а не индексный указатель позиции столбца.

Если вы хотите получить доступ к столбцам по их положению, вы можете:

df[df.columns[0]] 

, что происходит, чем, это вы получите список столбцов ФРА, и вы выбираете термин «0» и передать его к df в качестве ссылки.

надежда, что поможет вам понять

+0

Другим вариантом будет: 'df.iloc [:, 0]'. – IanS

Смежные вопросы