Jestem zainteresowany wiedzą, jak przekonwertować ramkę danych pandy na tablicę NumPy.
ramka danych:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
daje
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Chciałbym przekonwertować to na tablicę NumPy, ponieważ:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
W jaki sposób mogę to zrobić?
Jako bonus, czy możliwe jest zachowanie takich typów, jak ten?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
lub podobne?
Odpowiedzi:
Aby przekonwertować ramkę danych pandy (df) na numeryczną ndarray, użyj tego kodu:
źródło
Przestań używać
values
ias_matrix()
!panda v0.24.0 wprowadziła dwie nowe metody uzyskiwania tablic NumPy z obiektów pand:
to_numpy()
, Który jest zdefiniowanyIndex
,Series,
iDataFrame
obiektów, aarray
, który jest zdefiniowanyIndex
i dotyczySeries
tylko obiektów.Jeśli odwiedzisz dokumentację v0.24
.values
, zobaczysz duże czerwone ostrzeżenie z napisem:Więcej informacji można znaleźć w tej sekcji informacji o wersji v0.24.0 i w tej odpowiedzi .
W kierunku lepszej spójności:
to_numpy()
W duchu lepszej spójności w całym interfejsie API wprowadzono nową metodę
to_numpy
wydobywania bazowej tablicy NumPy z DataFrames.Jak wspomniano powyżej, ta metoda jest również zdefiniowana w obiektach
Index
iSeries
obiektach (patrz tutaj ).Domyślnie widok jest zwracany, więc wszelkie dokonane modyfikacje wpłyną na oryginał.
Jeśli zamiast tego potrzebujesz kopii, użyj
to_numpy(copy=True
).panda> = aktualizacja 1.0 dla ExtensionTypes
Jeśli używasz pand 1.x, prawdopodobnie będziesz miał do czynienia z typami rozszerzeń o wiele więcej. Musisz być trochę bardziej ostrożny, aby te typy rozszerzeń zostały poprawnie przekonwertowane.
Jest to przywołane w dokumentach .
Jeśli potrzebujesz
dtypes
...Jak pokazano w innej odpowiedzi,
DataFrame.to_records
jest to dobry sposób na zrobienie tego.to_numpy
Niestety nie da się tego zrobić . Alternatywnie możesz użyćnp.rec.fromrecords
:Pod względem wydajności jest prawie taki sam (w rzeczywistości korzystanie
rec.fromrecords
jest nieco szybsze).Uzasadnienie dodania nowej metody
to_numpy()
(opróczarray
) dodano w wyniku dyskusji na temat dwóch zagadnień GitHub: GH19954 i GH23623 .W szczególności dokumenty wspominają o uzasadnieniu:
to_numpy
dążyć do poprawy spójności interfejsu API, co stanowi duży krok we właściwym kierunku..values
nie będzie przestarzałe w bieżącej wersji, ale spodziewam się, że tak się stanie w przyszłości, więc zachęcam użytkowników do migracji w kierunku nowszego interfejsu API, tak szybko, jak to możliwe.Krytyka innych rozwiązań
DataFrame.values
ma niespójne zachowanie, jak już wspomniano.DataFrame.get_values()
to po prostu opakowanieDataFrame.values
, więc wszystko, co powiedziano powyżej, ma zastosowanie.DataFrame.as_matrix()
jest przestarzałe, NIE używaj!źródło
as_matrix
innego rozwiązania, w tym przypadkuto_numpy
bez wyjaśnienia, jak odzyskać funkcjonalność wyboru kolumnyas_matrix
! Jestem pewien, że istnieją inne sposoby wyboru kolumn, aleas_matrix
był przynajmniej jeden z nich!df[[col1, col2']].to_numpy()
? Nie wiem, dlaczego uważasz, że chcesz zareklamować zaktualizowaną alternatywę dla przestarzałej funkcji, uzasadnia odpowiedź negatywną na odpowiedź.Uwaga :
.as_matrix()
metoda zastosowana w tej odpowiedzi jest przestarzała. Panda 0.23.4 ostrzega:Pandy mają coś wbudowanego ...
daje
źródło
object
.to_numpy
zamiast tego (nie.values
albo). Więcej tutaj .Po prostu połączę funkcje DataFrame.reset_index () i DataFrame.values, aby uzyskać reprezentację Numpy ramki danych, w tym indeksu:
Aby uzyskać typy, musielibyśmy przekształcić tę tablicę ndarray w tablicę strukturalną za pomocą widoku :
źródło
Możesz użyć tej
to_records
metody, ale musisz się trochę pobawić z typami dtypów, jeśli od samego początku nie są to, czego chcesz. W moim przypadku po skopiowaniu pliku DF z łańcucha typ indeksu to ciąg (reprezentowany przezobject
dtype w pandach):Konwersja typu recarray dtype nie działa dla mnie, ale można to zrobić już w Pandach:
Zauważ, że Panda nie ustawia poprawnie nazwy indeksu (do
ID
) w eksportowanej tablicy rekordów (błąd?), Więc korzystamy z konwersji typu, aby również to poprawić.W tej chwili Pandy mają tylko 8-bajtowe liczby całkowite
i8
i są zmiennoprzecinkowef8
(patrz ten problem ).źródło
np.array
konstruktora.Wygląda na to,
df.to_records()
że zadziała dla ciebie. Dokładna funkcja, której szukasz, została poproszona ito_records
wskazana jako alternatywa.Wypróbowałem to lokalnie na twoim przykładzie, a to wywołanie daje coś bardzo podobnego do wyjścia, którego szukałeś:
Zauważ, że jest to
recarray
raczej niżarray
. Możesz przenieść wynik do zwykłej tablicy numpy, wywołując jej konstruktor jakonp.array(df.to_records())
.źródło
to_records()
5 lat wcześniej?Spróbuj tego:
źródło
Oto moje podejście do tworzenia tablicy struktur z pand DataFrame.
Utwórz ramkę danych
Zdefiniuj funkcję, aby utworzyć tablicę struktury numpy (nie tablicę rekordów) z pandy DataFrame.
Służy
reset_index
do tworzenia nowej ramki danych zawierającej indeks jako część jego danych. Konwertuj tę ramkę danych na tablicę struktur.EDYCJA: Zaktualizowano df_to_sarray, aby uniknąć błędu wywołania .encode () w Pythonie 3. Dziękujemy Josephowi Garvinowi i halcyonowi za komentarz i rozwiązanie.
źródło
Dwa sposoby przekonwertowania ramki danych na jej reprezentację tablicy Numpy.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Dokument: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
źródło
Prostszy sposób na przykład DataFrame:
POSŁUGIWAĆ SIĘ:
DOSTAĆ:
źródło
Miałem podobny problem podczas eksportowania z ramki danych do tabeli arcgis i natknąłem się na rozwiązanie z usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). Krótko mówiąc, twój problem ma podobne rozwiązanie:
źródło
Przejrzałem powyższe odpowiedzi. Metoda „ as_matrix () ” działa, ale jest już przestarzała. Dla mnie zadziałało „ .to_numpy () ”.
Zwraca tablicę wielowymiarową. Wolę używać tej metody, jeśli czytasz dane z arkusza programu Excel i potrzebujesz dostępu do danych z dowolnego indeksu. Mam nadzieję że to pomoże :)
źródło
Po odpowiedzi meteora znalazłem kod
nie działa dla mnie Dlatego umieściłem tutaj swój kod dla wygody innych osób, które borykają się z tym problemem.
źródło
Prosty sposób na konwersję ramki danych na tablicę numpy:
Zalecane jest używanie to_numpy w celu zachowania spójności.
Odniesienie: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
źródło
Spróbuj tego:
Więcej informacji na stronie: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Ważne dla numpy 1.16.5 i pand 0.25.2.
źródło