2014-11-26 10 views
5

Staram się zachować tylko niektóre kolumny w DataFrame, i to działa dobrze, gdy nazwy kolumn są ciągi:pandy Index DataFrame numerami kolumn, gdy nazwy kolumn są liczbami całkowitymi

In [2]: import numpy as np 

In [3]: import pandas as pd 

In [4]: a = np.arange(35).reshape(5,7) 

In [5]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], ['a', 'b', 'c', 'd', 'e', 'f', 'g']) 

In [6]: df 
Out[6]: 
    a b c d e f g 
x 0 1 2 3 4 5 6 
y 7 8 9 10 11 12 13 
u 14 15 16 17 18 19 20 
z 21 22 23 24 25 26 27 
w 28 29 30 31 32 33 34 

[5 rows x 7 columns] 

In [7]: df[[1,3]] #No problem 
Out[7]: 
    b d 
x 1 3 
y 8 10 
u 15 17 
z 22 24 
w 29 31 

Jednak, gdy nazwy kolumn są całkowitymi, jestem coraz kluczową błąd:

In [8]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17)) 

In [9]: df 
Out[9]: 
    10 11 12 13 14 15 16 
x 0 1 2 3 4 5 6 
y 7 8 9 10 11 12 13 
u 14 15 16 17 18 19 20 
z 21 22 23 24 25 26 27 
w 28 29 30 31 32 33 34 

[5 rows x 7 columns] 

In [10]: df[[1,3]] 

wyniki w:

KeyError: '[1 3] not in index' 

widzę dlaczego pan das nie pozwala na to -> w celu uniknięcia pomieszania między indeksowaniem według nazw kolumn i numerów kolumn. Czy jest jednak jakiś sposób, aby powiedzieć pandom, że chcę indeksować według numerów kolumn? Oczywiście jednym z rozwiązań jest zamiana nazw kolumn na łańcuchy, ale zastanawiam się, czy istnieje lepsze rozwiązanie.

Odpowiedz

8

To jest dokładnie cel iloc, patrz here

In [37]: df 
Out[37]: 
    10 11 12 13 14 15 16 
x 0 1 2 3 4 5 6 
y 7 8 9 10 11 12 13 
u 14 15 16 17 18 19 20 
z 21 22 23 24 25 26 27 
w 28 29 30 31 32 33 34 

In [38]: df.iloc[:,[1,3]] 
Out[38]: 
    11 13 
x 1 3 
y 8 10 
u 15 17 
z 22 24 
w 29 31 
2

Jest to z pewnością jedna z tych rzeczy, która wydaje się być błędem, ale tak naprawdę jest decyzją projektową (chyba).

Kilka obejść opcji:

zmienić nazwę kolumny z ich pozycji jak ich nazwy:

df.columns = arange(0,len(df.columns)) 

Innym sposobem jest uzyskanie nazwisk z df.columns:

print df[ df.columns[[1,3]] ] 
    11 13 
x 1 3 
y 8 10 
u 15 17 
z 22 24 
w 29 31 

I podejrzewam, że jest najbardziej atrakcyjny, ponieważ wymaga jedynie dodania odrobiny kodu i niezmieniania nazw kolumn.

Powiązane problemy