Mam dane w różnych kolumnach, ale nie wiem, jak je wyodrębnić, aby zapisać je w innej zmiennej.
index a b c
1 2 3 4
2 3 4 5
Jak wybrać 'a'
, 'b'
i zapisać go w celu DF1?
próbowałem
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Wydaje się, że żaden nie działa.
.ix
ponieważ jest to niejednoznaczne. Użyj.iloc
lub.loc
jeśli musisz.> csvtable_imp_1 <- csvtable_imp[0:6]
i wybiera wielkość delty pierwszych kolumn od 0 do 6. Wszystko, co musiałem zrobić, to odczytać tabelę csv ograniczoną przez bibliotekę readr.infile_1 = largefile_stay.ix[:,0:6]
ix
jest teraz przestarzały. Panda zaleca stosowanie:loc
(indeksowania na podstawie etykiet) lubiloc
(indeksowania na podstawie pozycji).Odpowiedzi:
Nazwy kolumn (które są ciągami znaków) nie mogą być pocięte na plasterki w sposób, w jaki próbowałeś.
Tutaj masz kilka opcji. Jeśli wiesz z kontekstu, które zmienne chcesz wyciąć, możesz po prostu zwrócić widok tylko tych kolumn, przekazując listę do
__getitem__
składni ([]).Alternatywnie, jeśli ważne jest indeksowanie ich numerycznie, a nie według nazwy (powiedzmy, że Twój kod powinien to zrobić automatycznie bez znajomości nazw dwóch pierwszych kolumn), możesz to zrobić w zamian:
Dodatkowo powinieneś zapoznać się z ideą widoku na obiekt Pandas vs. kopię tego obiektu. Pierwsza z powyższych metod zwróci nową kopię w pamięci pożądanego podobiektu (pożądanych wycinków).
Czasami jednak w Pandach istnieją konwencje indeksowania, które tego nie robią i zamiast tego dają nową zmienną, która odnosi się tylko do tego samego fragmentu pamięci, co podobiektyw lub plasterek w oryginalnym obiekcie. Stanie się tak w przypadku drugiego sposobu indeksowania, dzięki czemu można go zmodyfikować za pomocą
copy()
funkcji, aby uzyskać zwykłą kopię. Kiedy tak się dzieje, zmiana tego, co uważasz za wycięty obiekt, może czasem zmienić obiekt oryginalny. Zawsze dobrze jest na to uważać.Aby użyć
iloc
, musisz znać pozycje kolumn (lub indeksy). Ponieważ pozycje kolumn mogą się zmieniać, zamiast indeksów kodowanych na stałe , można użyćiloc
wraz zget_loc
funkcjącolumns
metody obiektu obiektu ramki danych w celu uzyskania indeksów kolumny.Teraz możesz użyć tego słownika, aby uzyskać dostęp do kolumn poprzez nazwy i użycie
iloc
.źródło
df[['a','b']]
produkuje kopięix[]
jeśli wolisz używaćix[]
z jakiegokolwiek powodu.ix
indeksuje wiersze, a nie kolumny. Myślałem, że OP chce kolumn.ix
akceptuje argumenty wycinków, dzięki czemu można uzyskać kolumny. Na przykładdf.ix[0:2, 0:2]
pobiera lewą górną pod-macierz 2x2, tak jak ma to miejsce w przypadku macierzy NumPy (oczywiście w zależności od nazw kolumn). Możesz nawet użyć składni plasterka w nazwach łańcuchów kolumn, takich jakdf.ix[0, 'Col1':'Col5']
. To powoduje, że wszystkie kolumny, które przypadkowo są uporządkowane międzyCol1
iCol5
wdf.columns
tablicy. Błędne jest twierdzenie, żeix
indeksuje wiersze. To tylko jego najbardziej podstawowe zastosowanie. Obsługuje także znacznie więcej indeksowania. Jest więcix
całkowicie ogólny dla tego pytania..iloc
która nie obejmuje ostatniej pozycji, podobnie jak listy w języku Python.Począwszy od wersji 0.11.0, kolumny mogą być pocięte na plasterki w sposób, w jaki próbowałeś użyć
.loc
indeksatora:jest równoważne z
i zwraca kolumny
C
przezE
.Demo na losowo generowanej DataFrame:
Aby uzyskać kolumny od C do E (zwróć uwagę, że w przeciwieństwie do krojenia na liczby całkowite, w kolumnach znajduje się „E”):
To samo działa w przypadku wybierania wierszy na podstawie etykiet. Uzyskaj wiersze „R6” do „R10” z tych kolumn:
.loc
akceptuje również tablicę boolowską, dzięki czemu można wybrać kolumny, których odpowiadający wpis w tablicy toTrue
. Na przykładdf.columns.isin(list('BCD'))
zwracaarray([False, True, True, True, False, False], dtype=bool)
- Prawda, jeśli nazwa kolumny znajduje się na liście['B', 'C', 'D']
; W przeciwnym razie fałszywe.źródło
Zakładając, że masz nazwy kolumn (
df.columns
)['index','a','b','c']
, to dane, które chcesz, znajdują się w trzeciej i czwartej kolumnie. Jeśli nie znasz ich nazw podczas działania skryptu, możesz to zrobićJak wskazuje EMS w swojej odpowiedzi ,
df.ix
wycina kolumny nieco bardziej zwięźle, ale.columns
interfejs krojenia może być bardziej naturalny, ponieważ wykorzystuje składnię indeksowania / krojenia list waniliowych 1-D.OSTRZEŻENIE:
'index'
to zła nazwaDataFrame
kolumny. Ta sama etykieta jest również używana dla rzeczywistegodf.index
atrybutu,Index
tablicy. Twoja kolumna jest zwracana przez,df['index']
a rzeczywisty indeks DataFrame jest zwracany przezdf.index
. AnIndex
jest specjalnym rodzajemSeries
zoptymalizowanym do wyszukiwania wartości jego elementów. W przypadku df.index służy do wyszukiwania wierszy według ich etykiety. Tendf.columns
atrybut jest równieżpd.Index
tablicą służącą do wyszukiwania kolumn według ich etykiet.źródło
.ix
jest nie tylko dla wierszy. Służy do krojenia ogólnego i może być używany do krojenia wielowymiarowego. Jest to po prostu interfejs do zwykłej__getitem__
składni NumPy . Mimo to, można łatwo przekonwertować problem kolumny krojenia do krojenia problemu wiersz po prostu stosując operację transpozycjidf.T
. Twój przykład wykorzystujecolumns[1:3]
, co jest nieco mylące. Wynikiemcolumns
jestSeries
; uważaj, aby nie traktować go jak tablicy. Powinieneś też zmienić tę opcję,columns[2:3]
aby dopasować ją do komentarza „3 i 4”.[2:4]
jest poprawny. Twój[2:3]
jest zły. A użycie standardowej notacji krojenia Pythona do generowania sekwencji / Serii nie wprowadza w błąd IMO. Ale podoba mi się obejście interfejsu DataFrame w celu uzyskania dostępu do podstawowej tablicy numpyix
.df.columns
i chcesz pokroić go według etykiety , wówczas będziesz miał inną semantykę cięcia niż gdybyś pokroić według pozycji indeksu liczb całkowitych . Jednak zdecydowanie nie wyjaśniłem tego dobrze w poprzednim komentarzu.columns
to niezmienna seria, a getter został nadpisany, aby używać etykiet jako indeksów. Dziękujemy za poświęcenie czasu na wyjaśnienie.źródło
df[['b as foo', 'c as bar']
tak, że wyjście zmienia nazwę kolumnyb
jakofoo
i kolumnyc
jakobar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Zdaję sobie sprawę, że to pytanie jest dość stare, ale w najnowszej wersji pand istnieje prosty sposób, aby to zrobić. Nazwy kolumn (które są ciągami znaków) można kroić w dowolny sposób.
źródło
Możesz podać listę kolumn do usunięcia i zwrócić DataFrame z potrzebnymi tylko kolumnami przy użyciu
drop()
funkcji Pandas DataFrame.Tylko mówię
zwróci DataFrame tylko z kolumnami
b
ic
.drop
Metoda udokumentowane tutaj .źródło
Z pandami,
nazwy kolumn dowcipu
aby wybrać według iloc i określonych kolumn o numerze indeksu:
z loc nazwy kolumn mogą być używane jak
źródło
Uważam, że ta metoda jest bardzo przydatna:
Więcej informacji można znaleźć tutaj
źródło
surveys_df.iloc [:, [2,5]]
wtedy.Począwszy od 0.21.0, używanie
.loc
lub[]
z listą z jedną lub kilkoma brakującymi etykietami jest przestarzałe na korzyść.reindex
. Tak więc odpowiedź na twoje pytanie brzmi:df1 = df.reindex(columns=['b','c'])
W poprzednich wersjach używanie
.loc[list-of-labels]
działało tak długo, jak znaleziono przynajmniej 1 klucz (w przeciwnym razie powodowałoby powstanie aKeyError
). To zachowanie jest przestarzałe i teraz wyświetla komunikat ostrzegawczy. Zalecaną alternatywą jest użycie.reindex()
.Przeczytaj więcej na stronie Indeksowanie i wybieranie danych
źródło
Możesz użyć pand. Tworzę DataFrame:
DataFrame:
Aby wybrać 1 lub więcej kolumn według nazwy:
Możesz także użyć:
I dostaniesz kolumnę
Test_2
Możesz także wybrać kolumny i wiersze z tych wierszy za pomocą
.loc()
. Nazywa się to „krojeniem” . Zauważ, że zabieram z kolumnyTest_1
doTest_3
„Kromka” to:
A jeśli chcesz
Peter
i tylkoAnn
z kolumnTest_1
iTest_3
:Dostajesz:
źródło
Jeśli chcesz uzyskać jeden element według indeksu wierszy i nazwy kolumny, możesz to zrobić podobnie
df['b'][0]
. To jest tak proste, jak możesz sobie wyobrazić.Lub możesz użyć
df.ix[0,'b']
mieszanego użycia indeksu i etykiety.Uwaga: Od wersji 2.0.20
ix
jest przestarzałe na rzeczloc
/iloc
.źródło
Jedno inne i łatwe podejście: powtarzanie wierszy
używając iterow
źródło
Różne podejścia omówione w powyższych odpowiedziach opierają się na założeniu, że albo użytkownik zna indeksy kolumn, które należy upuścić lub podzbiór, albo użytkownik chce podzestawić ramkę danych przy użyciu zakresu kolumn (na przykład między „C”: „E”) . pandas.DataFrame.drop () jest z pewnością opcja podzbiór danych na podstawie listy kolumn zdefiniowanych przez użytkownika (chociaż trzeba być ostrożnym, aby zawsze używać kopię dataframe i Ustalone parametry nie powinna być ustawiona na wartość True !!)
Inną opcją jest użycie pandas.columns.difference () , która robi różnicę w nazwach kolumn i zwraca typ indeksu tablicy zawierającej pożądane kolumny. Oto rozwiązanie:
Dane wyjściowe będą:
b c 1 3 4 2 4 5
źródło
df1 = df[df.columns.difference(columns_for_differencing)]
zwróci nową / skopiowaną ramkę danych. Będziesz mógł modyfikowaćdf1
bez zmiandf
. Dziękuję, btw. Właśnie tego potrzebowałem.możesz także użyć df.pop ()
daj mi znać, jeśli to ci pomoże, użyj df.pop (c)
źródło
Widziałem kilka odpowiedzi na ten temat, ale pozostały mi niejasne. Jak wybrałbyś te interesujące kolumny? Odpowiedź brzmi: jeśli masz je zebrane na liście, możesz po prostu odwoływać się do kolumn za pomocą listy.
Przykład
Mam następującą tablicę list / numpy
extracted_features
, określającą 63 kolumny. Oryginalny zestaw danych ma 103 kolumny i chciałbym wyodrębnić dokładnie te, a następnie użyłbymI skończysz z tym
Tego często używasz w uczeniu maszynowym (a dokładniej w wyborze funkcji). Chciałbym również omówić inne sposoby, ale myślę, że zostały już omówione przez inne kwiaty stosu. Mam nadzieję, że to było pomocne!
źródło
Możesz użyć
pandas.DataFrame.filter
metody do filtrowania lub zmiany kolejności kolumn w następujący sposób:źródło
źródło