Jak przekonwertować serię pand lub indeks na tablicę Numpy?


264

Czy wiesz, jak uzyskać indeks lub kolumnę DataFrame jako tablicę NumPy lub listę python?



Czy to odpowiada na twoje pytanie? Konwertuj ramkę danych pand na tablicę NumPy
AMC

1
UWAGA: Konieczność konwersji Pandas DataFrame na tablicę (lub listę) w ten sposób może wskazywać na inne problemy. Zdecydowanie zalecam upewnienie się, że DataFrame jest odpowiednią strukturą danych dla konkretnego przypadku użycia i że Pandas nie zawiera żadnego sposobu wykonywania operacji, którymi jesteś zainteresowany.
AMC

Odpowiedzi:


353

Aby uzyskać tablicę NumPy, należy użyć valuesatrybutu:

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

Dostęp do tego, jak dane są już przechowywane, więc nie ma potrzeby konwersji.
Uwaga: ten atrybut jest również dostępny dla wielu innych obiektów pand.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Aby uzyskać indeks jako listę, zadzwoń tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

I podobnie w przypadku kolumn.


Uwaga: .valuesjest przestarzałe, .to_numpy()jest sugerowanym zamiennikiem, jeśli chcesz mieć tablicę NumPy. Czy możesz rozwinąć To Dostęp do tego, jak dane są już przechowywane, więc nie ma potrzeby konwersji ?
AMC

Odpowiedź przez CS95 daje wielką wyjaśnienie .values, .to_numpy()i .array.
AMC

75

Możesz użyć, df.indexaby uzyskać dostęp do obiektu indeksu, a następnie uzyskać wartości z listy za pomocą df.index.tolist(). Podobnie możesz użyć df['col'].tolist()dla Series.


Zwraca instanceMethod, a nie tablicę list
V Shreyas

12
@VShreyas, a co powiesz nadf.index.values.tolist()
LancelotHolmes,

3
df.index.tolist()nie zwraca metody instancji. Zwraca listę indeksów. Jest to metoda zdefiniowana na indeksie pand. Podczas gdy najpierw można wywoływać wartości, delegowanie zadania do numpy nie jest poprawką - tylko alternatywą.
ayhan

51

pandy> = 0,24

Przestań używać swojego sposobu .valuesna rzecz tych metod!

Od v0.24.0 roku, będziemy mieli dwa zupełnie nowe, klapsy preferowane sposoby otrzymywania tablic numpy z Index, Seriesoraz DataFrameobiektów: są to_numpy()i .array. Jeśli chodzi o użycie, dokumenty wspominają:

Nie zostały usunięte lub przestarzałe Series.valueslub DataFrame.values, ale zalecamy i za pomocą .arraylub .to_numpy()zamiast.

Więcej informacji można znaleźć w tej sekcji informacji o wersji v0.24.0 .


to_numpy() metoda

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Domyślnie widok jest zwracany. Wszelkie dokonane modyfikacje wpłyną na oryginał.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Jeśli zamiast tego potrzebujesz kopii, użyj to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Pamiętaj, że ta funkcja działa również w przypadku DataFrames (chociaż .arraynie działa).


arrayAtrybut
Ten atrybut zwracaExtensionArrayobiekt, który wspiera indeks / serię.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

Stąd można uzyskać listę za pomocą list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

lub po prostu zadzwoń bezpośrednio .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

Dokumenty wspominają o tym, co jest zwracane,

Dla Seriesi Indexes wspierane przez normalne tablice NumPy, Series.array zwróci nowe arrays.PandasArray, cienkie (bez kopii) opakowanie wokół numpy.ndarray. arrays.PandasArraysam w sobie nie jest szczególnie użyteczny, ale zapewnia taki sam interfejs, jak każda tablica rozszerzeń zdefiniowana w pandach lub przez bibliotekę innej firmy.

Podsumowując, .arraywróci albo

  1. Istniejący ExtensionArraypodkład indeksu / serii, lub
  2. Jeśli istnieje szereg NumPy wspierający serię, nowy ExtensionArrayobiekt jest tworzony jako cienkie opakowanie nad podstawową tablicą.

Uzasadnienie dodania DWÓCH nowych metod
Funkcje te zostały dodane w wyniku dyskusji w ramach dwóch zagadnień GitHub GH19954 i GH23623 .

W szczególności dokumenty wspominają o uzasadnieniu:

[...] .valuesnie było jasne, czy zwrócona wartość będzie rzeczywistą tablicą, jakąś jej transformacją, czy jedną z niestandardowych tablic pand (jak Categorical). Na przykład, z PeriodIndex, .values generuje nowy ndarrayokresu obiektów za każdym razem. [...]

Te dwie funkcje mają na celu poprawę spójności interfejsu API, co jest ważnym krokiem we właściwym kierunku.

Wreszcie, .valuesnie będzie przestarzała w obecnej wersji, ale spodziewam się, że może się to zdarzyć w pewnym momencie w przyszłości, więc zachęcam użytkowników do migracji w kierunku nowszego interfejsu API, tak szybko, jak to możliwe.


48

Jeśli masz do czynienia z ramką danych z wieloma indeksami, możesz być zainteresowany wyodrębnieniem tylko kolumny jednej nazwy z wieloma indeksami. Możesz to zrobić jako

df.index.get_level_values('name_sub_index')

i oczywiście name_sub_indexmusi być elementemFrozenList df.index.names


16

Od pandy v0.13 możesz także używać get_values:

df.index.get_values()

5
Czy istnieje różnica między tym a wartościami? (Zaktualizowałem informacje o wersji, ponieważ ta funkcja pojawia się w dokumentacji 0.13.0.)
Andy Hayden

@Andy Hayden: Czy nie jest jedna różnica, że ​​.get_values ​​jest oficjalnym sposobem uzyskiwania tylko bieżących wartości, podczas gdy .values ​​(np. W indeksie wielopunktowym) może zwracać wartości indeksu, dla których wiersze lub kolumny zostały usunięte?
Ezekiel Kruglick

@EzekielKruglick, więc zawsze jest to kopia? Powiązanie z dokumentacją jest bardzo lekkie, nie sądziłem, że dostajesz takie duplikaty (nawet jeśli są w MI, nie będą w wartościach), świetnie byłoby zobaczyć przykład, który to pokazuje!
Andy Hayden,

@AndyHayden: Myślę, że źle czytałem twój komentarz. Masz rację, .values ​​jest dobre, .level daje przestarzałe, a get_values ​​poprawnie podaje bieżące wartości z wyłączeniem upuszczonych wierszy / kolumn. Oryginalny numer github: github.com/pydata/pandas/issues/3686 Ale właśnie sprawdziłem i wygląda na to, że .values ​​(oczywiście!) Podaje aktualne informacje w innej formie niż myślałem, o czym mówiliśmy
Ezekiel Kruglick

1
@AndyHayden Nie, nie ma różnicy. get_valuespo prostu dzwoni .values. Można wpisać więcej znaków.
cs95

0

Konwertowane pandy dataframesię list, a następnie stosuje się podstawowy list.index(). Coś takiego:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Masz wartość indeksu jako idx.


a następnie użył podstawowej list.index () Jak to się wiąże z pytaniem o konwersję serii na listę?
AMC

0

Nowszym sposobem na to jest użycie funkcji .to_numpy ().

Jeśli mam ramkę danych z kolumną „cena”, mogę ją przekonwertować w następujący sposób:

priceArray = df['price'].to_numpy()

Można również przekazać typ danych, taki jak zmiennoprzecinkowy lub obiekt, jako argument funkcji


-1

Poniżej znajduje się prosty sposób na konwersję kolumny ramki danych na tablicę numpy.

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy jest tablicą numpy.

Próbowałem z, to.numpy()ale dał mi następujący błąd: TypeError: brak obsługiwanej konwersji dla typów: (dtype ('O'),) podczas robienia klasyfikacji binarnej przy użyciu Linear SVC. to.numpy () konwertuje dataFrame na tablicę numpy, ale typ danych elementu wewnętrznego to lista, z powodu której zaobserwowano powyższy błąd.


Próbowałem z to.numpy (), ale dał mi następujący błąd: TypeError: brak obsługiwanej konwersji dla typów: (dtype ('O'),) podczas robienia klasyfikacji Binary Relevance za pomocą Linear SVC. to.numpy () konwertuje dataFrame na tablicę numpy, ale typ danych elementu wewnętrznego to lista, z powodu której zaobserwowano powyższy błąd. Ale to nie jest tak naprawdę wina to_numpy.
AMC
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.