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 14
b 25
c 36In[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.
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 ?
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.
@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.
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
Istniejący ExtensionArraypodkład indeksu / serii, lub
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.
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ć elementemFrozenListdf.index.names
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])
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.
Odpowiedzi:
Aby uzyskać tablicę NumPy, należy użyć
values
atrybutu: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.
Aby uzyskać indeks jako listę, zadzwoń
tolist
:I podobnie w przypadku kolumn.
źródło
.values
jest 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 ?.values
,.to_numpy()
i.array
.Możesz użyć,
df.index
aby 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.źródło
df.index.values.tolist()
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ą.pandy> = 0,24
Przestań używać swojego sposobu
.values
na rzecz tych metod!Od v0.24.0 roku, będziemy mieli dwa zupełnie nowe, klapsy preferowane sposoby otrzymywania tablic numpy z
Index
,Series
orazDataFrame
obiektów: sąto_numpy()
i.array
. Jeśli chodzi o użycie, dokumenty wspominają:Więcej informacji można znaleźć w tej sekcji informacji o wersji v0.24.0 .
to_numpy()
metodaDomyślnie widok jest zwracany. Wszelkie dokonane modyfikacje wpłyną na oryginał.
Jeśli zamiast tego potrzebujesz kopii, użyj
to_numpy(copy=True
);Pamiętaj, że ta funkcja działa również w przypadku DataFrames (chociaż
.array
nie działa).array
AtrybutTen atrybut zwraca
ExtensionArray
obiekt, który wspiera indeks / serię.Stąd można uzyskać listę za pomocą
list
:lub po prostu zadzwoń bezpośrednio
.tolist()
:Dokumenty wspominają o tym, co jest zwracane,
Podsumowując,
.array
wróci alboExtensionArray
podkład indeksu / serii, lubExtensionArray
obiekt 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:
Te dwie funkcje mają na celu poprawę spójności interfejsu API, co jest ważnym krokiem we właściwym kierunku.
Wreszcie,
.values
nie 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.źródło
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
i oczywiście
name_sub_index
musi być elementemFrozenList
df.index.names
źródło
Od pandy v0.13 możesz także używać
get_values
:źródło
get_values
po prostu dzwoni.values
. Można wpisać więcej znaków.Konwertowane pandy
dataframe
sięlist
, a następnie stosuje się podstawowylist.index()
. Coś takiego:Masz wartość indeksu jako
idx
.źródło
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:
Można również przekazać typ danych, taki jak zmiennoprzecinkowy lub obiekt, jako argument funkcji
źródło
Poniżej znajduje się prosty sposób na konwersję kolumny ramki danych na tablicę numpy.
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.źródło
to_numpy
.