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ć values
atrybutu:
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.
.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 ?
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.
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ą.
.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
oraz DataFrame
obiektów: są to_numpy()
i .array
. Jeśli chodzi o użycie, dokumenty wspominają:
Nie zostały usunięte lub przestarzałe
Series.values
lubDataFrame.values
, ale zalecamy i za pomocą.array
lub.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ż .array
nie działa).
array
Atrybut
Ten atrybut zwracaExtensionArray
obiekt, 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
Series
iIndex
es wspierane przez normalne tablice NumPy,Series.array
zwróci nowearrays.PandasArray
, cienkie (bez kopii) opakowanie wokółnumpy.ndarray
.arrays.PandasArray
sam 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, .array
wróci albo
ExtensionArray
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:
[...]
.values
nie 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
,.values
generuje nowyndarray
okresu 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, .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.
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_index
musi być elementemFrozenList
df.index.names
Od pandy v0.13 możesz także używać get_values
:
df.index.get_values()
get_values
po prostu dzwoni .values
. Można wpisać więcej znaków.
Konwertowane pandy dataframe
się 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
.