2017-01-31 22 views
1

Diese Frage ist seltsam, da ich weiß, wie etwas zu tun, aber ich weiß nicht, warum ich es nicht anders kann.Get Pandas DataFrame erste Spalte

Angenommen einfacher Datenrahmen:

import pandasas pd 
a = pd.DataFrame([[0,1], [2,3]]) 

ich diesen Datenrahmen kann sehr leicht in Scheiben schneiden, erste Spalte ist a[[0]] ist die zweite a[[1]]. Einfach ist es nicht?

Jetzt haben wir komplexeren Datenrahmen. Dies ist Teil meines Code:

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 

Datenrahmen frame ist auch Pandas Datenrahmen, wie ein. Ich kann zweite Spalte sehr leicht als frame[[1]]. Aber wenn ich frame[[0]] versuchen bekomme ich einen Fehler:

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 

ich noch frame.iloc[:,0] verwenden, aber Problem ist, dass ich nicht verstehe, warum ich einfach Aufschneiden von [[]] verwenden kann nicht? Ich benutze Winpython Spyder 3, wenn das hilft.

+3

Es funktioniert in der ersten DataFrame, weil dieser eine Spalte namens "0" hat. Es ist zufällig die erste Spalte, aber das muss nicht sein. Es könnte eine andere Spalte mit diesem Namen gewesen sein. Um dasselbe zu verwenden, müssen Sie auf den Namen zugreifen ('frame [['Variable']] 'vorausgesetzt, Sie möchten einen DataFrame zurückgeben - keine Serie). – ayhan

Antwort

3

mit Ihrem Code:

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 

, wenn Sie aus dem ‚Rahmen‘ zu drucken, stellen Sie bekommen:

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

So ist die Ursache des Problems offensichtlich wird, haben Sie keine Spalte namens ' 0 '. In der ersten Zeile geben Sie eine Liste mit dem Namen var_vec an. In Zeile 4 erstellen Sie einen Datenrahmen aus dieser Liste, aber Sie geben die Indexwerte und den Spaltennamen an (was in der Regel gute Praxis ist). Der numerische Spaltenname '0', '1', .., wie im ersten Beispiel, findet nur statt, wenn Sie den Spaltennamen nicht angeben, da es sich nicht um einen Spaltenpositionsindexer handelt.

Wenn Sie Spalten durch ihre Position zuzugreifen, können Sie:

df[df.columns[0]] 

was als der Fall ist, ist die Liste der Spalten der df, und Sie wählen den Begriff ‚0‘ und es passieren zum df als Referenz.

hoffe, dass Sie verstehen

+0

Eine andere Option wäre: 'df.iloc [:, 0]'. – IanS