Mam następujące DataFrame
( df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
Dodaję więcej kolumn według przypisania:
df['mean'] = df.mean(1)
Jak mogę przenieść kolumnę mean
na przód, tzn. Ustawić ją jako pierwszą kolumnę, pozostawiając kolejność pozostałych kolumn nietkniętą?
MultiIndex
. Nie .Odpowiedzi:
Jednym prostym sposobem byłoby ponowne przypisanie ramki danych z listą kolumn, w razie potrzeby zmienioną w kolejności.
Oto co masz teraz:
Zmień układ
cols
w dowolny sposób. W ten sposób przesunąłem ostatni element na pierwszą pozycję:Następnie zmień kolejność ramki danych w następujący sposób:
źródło
cols
tolist
; pozwala nawet na duplikaty (które zostaną odrzucone, gdy zostaną użyte w ramce danych). Myślisz oIndex
przedmiotach.Możesz także zrobić coś takiego:
Możesz uzyskać listę kolumn za pomocą:
Dane wyjściowe wytworzą:
... który następnie można łatwo zmienić ręcznie przed upuszczeniem go do pierwszej funkcji
źródło
df.columns.tolist()
df = df[['mean1', 0, 1, 2, 3]]
✓pd.read_csv()
. Jak można wykorzystać swoją odpowiedź do zmiany kolejności kolumn?Po prostu przypisz nazwy kolumn w żądanej kolejności:
Teraz z przodu pojawia się kolumna „średnia”:
źródło
<df>.columns
Co powiesz na:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
źródło
pandas
? coś jakdf.move(0,df.mean)
?df_metadata.insert(0,'Db_name',"raw_data")
(Kod nie dotyczy tego wątku)*** ValueError: cannot insert mean, already exists
W Twoim przypadku,
zrobi dokładnie to, co chcesz.
W moim przypadku (forma ogólna):
źródło
copy=False
ale wygląda na to, żereindex_axis
nadal tworzy kopię.Musisz utworzyć nową listę kolumn w żądanej kolejności, a następnie użyć,
df = df[cols]
aby zmienić kolejność kolumn w tej nowej kolejności.Możesz także zastosować bardziej ogólne podejście. W tym przykładzie ostatnia kolumna (oznaczona przez -1) jest wstawiana jako pierwsza kolumna.
Możesz także użyć tego podejścia do zmiany kolejności kolumn w żądanej kolejności, jeśli są one obecne w ramce danych.
źródło
Możesz wypróbować następujące rozwiązania:
Rozwiązanie 1:
Rozwiązanie 2:
Rozwiązanie 3:
Rozwiązanie 4:
Rozwiązanie 5:
rozwiązanie 6:
Porównanie czasu:
Rozwiązanie 1:
Rozwiązanie 2 :
Rozwiązanie 3 :
Rozwiązanie 4 :
Rozwiązanie 5 :
Rozwiązanie 6 :
źródło
df = df.iloc[:, [1, 2, 3, 0]]
Od sierpnia 2018 r .:
Jeśli nazwy kolumn są zbyt długie, aby je wpisać, możesz określić nowe zamówienie za pomocą listy liczb całkowitych z pozycjami:
Dane:
Ogólny przykład:
I dla konkretnego przypadku pytania OP:
Głównym problemem związanym z tym podejściem jest to, że wielokrotne wywołanie tego samego kodu spowoduje za każdym razem inne wyniki, dlatego należy zachować ostrożność :)
źródło
Ta funkcja pozwala uniknąć listy wszystkich zmiennych w zbiorze danych, aby zamówić kilka z nich.
Wymaga dwóch argumentów, pierwszy to zestaw danych, drugi to kolumny w zestawie danych, które chcesz przenieść na pierwszy plan.
Tak więc w moim przypadku mam zestaw danych o nazwie Frame ze zmiennymi A1, A2, B1, B2, Total i Date. Jeśli chcę przenieść Total na pierwszy plan, wszystko, co muszę zrobić, to:
Jeśli chcę przenieść na początek Total i Date, to:
EDYTOWAĆ:
Innym przydatnym sposobem na użycie tego jest, jeśli masz nieznaną tabelę i szukasz zmiennych zawierających określony termin, takich jak VAR1, VAR2, ... możesz wykonać coś takiego:
źródło
Sam wpadłem na podobne pytanie i chciałem tylko dodać to, na czym się zdecydowałem. Podobało mi się
reindex_axis() method
zmienianie kolejności kolumn. To działało:Alternatywna metoda oparta na komentarzu @Jorge:
Chociaż
reindex_axis
wydaje się być nieco szybszy w mikro testach niżreindex
, myślę, że wolę ten drugi ze względu na jego bezpośredniość.źródło
Po prostu zrób
źródło
order = df.columns.tolist()
df['mean'] = df.mean(1)
df.columns = ['mean'] + order
headers
która została użyta do stworzenia słownika, który został następnie wykorzystany do utworzenia DataFrame, zadzwoniłemdf.reindex(columns=headers)
. Jedynym problemem, na jaki natknąłem się, było to, co jużdf.set_index('some header name', inplace=True)
wywołałem, więc kiedy reindex został zakończony, dodano kolejną kolumnę o nazwie,some header name
ponieważ oryginalna kolumna była teraz indeksem. Jeśli chodzi o składnię określoną powyżej,['mean'] + df.columns
interpreter w python daje miIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
Możesz wykonać następujące czynności (pożyczanie części od odpowiedzi Amana):
źródło
Po prostu wpisz nazwę kolumny, którą chcesz zmienić, i ustaw indeks nowej lokalizacji.
W twoim przypadku wyglądałoby to tak:
źródło
Przenoszenie dowolnej kolumny do dowolnej pozycji:
źródło
Myślę, że jest to nieco bardziej zgrabne rozwiązanie:
To rozwiązanie jest nieco podobne do rozwiązania @JoeHeffer, ale jest to jedna linijka.
Tutaj usuwamy kolumnę
"mean"
z ramki danych i dołączamy do indeksu0
o tej samej nazwie kolumny.źródło
Oto sposób na przeniesienie jednej istniejącej kolumny, która zmodyfikuje istniejącą ramkę danych.
źródło
Pytanie to zostało odebrane przed ale reindex_axis jest przestarzała teraz więc proponuję używać:
źródło
Co powiesz na użycie „T”?
źródło
@clocker: Twoje rozwiązanie było dla mnie bardzo pomocne, ponieważ chciałem umieścić dwie kolumny z przodu z ramki danych, w której nie znam dokładnie nazw wszystkich kolumn, ponieważ były one wcześniej generowane z instrukcji przestawnej. Tak więc, jeśli znajdujesz się w tej samej sytuacji: Aby przedstawić kolumny z przodu o znanej nazwie, a następnie pozwolić, aby następowały po nich „wszystkie pozostałe kolumny”, opracowałem następujące ogólne rozwiązanie;
źródło
set()
:Stosuje się proste podejście
set()
, zwłaszcza gdy masz długą listę kolumn i nie chcesz obsługiwać ich ręcznie:źródło
Podobało mi się odpowiedź Shoresha, aby użyć funkcji ustawiania do usuwania kolumn, gdy nie znasz lokalizacji, jednak to nie zadziałało dla mojego celu, ponieważ muszę zachować pierwotną kolejność kolumn (która ma dowolne etykiety kolumn).
Udało mi się to jednak, używając IndexedSet z pakietu boltons.
Musiałem także ponownie dodać wiele etykiet kolumn, więc dla bardziej ogólnego przypadku użyłem następującego kodu:
Mam nadzieję, że jest to przydatne dla każdego, kto szuka tego wątku w poszukiwaniu ogólnego rozwiązania.
źródło
set
do tego celu dość często i nigdy nie miałem do czynienia z zamówieniami.Możesz użyć,
reindex
którego można użyć dla obu osi:źródło
Oto funkcja pozwalająca to zrobić dla dowolnej liczby kolumn.
źródło
Metoda Hackiesta w książce
źródło
Myślę, że ta funkcja jest prostsza. Musisz tylko określić podzbiór kolumn na początku lub na końcu albo w obu przypadkach:
źródło
Uważam, że odpowiedź @ Aman jest najlepsza, jeśli znasz lokalizację drugiej kolumny.
Jeśli nie znasz lokalizacji
mean
, ale masz tylko jej nazwę, nie możesz bezpośrednio skorzystać z tej opcjicols = cols[-1:] + cols[:-1]
. Oto następna najlepsza rzecz, jaką mogłem wymyślić:źródło
Po prostu przewracanie często pomaga.
Lub po prostu przetasuj, aby zobaczyć.
źródło
Większość odpowiedzi nie uogólniała wystarczająco dużo, a metoda reindex_axis w pandach jest nieco żmudna, dlatego oferuję prostą funkcję przeniesienia dowolnej liczby kolumn do dowolnej pozycji za pomocą słownika, w którym klucz = nazwa kolumny i wartość = pozycja, do której należy przejść. Jeśli twoja ramka danych ma dużą wartość True na „big_data”, funkcja zwróci listę uporządkowanych kolumn. I możesz użyć tej listy do podzielenia danych.
źródło
Mam bardzo konkretny przypadek użycia do ponownego zamawiania nazw kolumn w pandach. Czasami tworzę nową kolumnę w ramce danych opartej na istniejącej kolumnie. Domyślnie pandy wstawią moją nową kolumnę na końcu, ale chcę, aby nowa kolumna została wstawiona obok istniejącej kolumny, z której pochodzi.
źródło
Dość prostym rozwiązaniem, które działało dla mnie, jest użycie .reindex na df.columns:
źródło