Czy wiesz, jak uzyskać indeks lub kolumnę DataFrame jako tablicę NumPy lub listę python?
Czy wiesz, jak uzyskać indeks lub kolumnę DataFrame jako tablicę NumPy lub listę python?
Odpowiedzi:
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.
.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.
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ą.
.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.valueslubDataFrame.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 .
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
SeriesiIndexes wspierane przez normalne tablice NumPy,Series.arrayzwróci nowearrays.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
ExtensionArraypodkład indeksu / serii, lubExtensionArrayobiekt 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 (jakCategorical). Na przykład, zPeriodIndex,.valuesgeneruje nowyndarrayokresu 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ć elementemFrozenList df.index.names
Od pandy v0.13 możesz także używać get_values:
df.index.get_values()
get_valuespo prostu dzwoni .values. Można wpisać więcej znaków.
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.
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.
to_numpy.