Jaki jest najłatwiejszy sposób usunięcia zduplikowanych kolumn z ramki danych?
Czytam plik tekstowy, który ma zduplikowane kolumny za pośrednictwem:
import pandas as pd
df=pd.read_table(fname)
Nazwy kolumn to:
Time, Time Relative, N2, Time, Time Relative, H2, etc...
Wszystkie kolumny Time i Time Relative zawierają te same dane. Chcę:
Time, Time Relative, N2, H2
Wszystkie moje próby upuszczania, usuwania itp., Takie jak:
df=df.T.drop_duplicates().T
Skutkuje unikalnymi wartościami błędów indeksu:
Reindexing only valid with uniquely valued index objects
Przepraszam, że jestem noobem Pandas. Wszelkie sugestie będą mile widziane.
Dodatkowe Szczegóły
Wersja Pandy: 0.9.0
Wersja Pythona: 2.7.3
Windows 7
(zainstalowana przez Pythonxy 2.7.3.0)
plik danych (uwaga: w rzeczywistym pliku kolumny są oddzielone tabulatorami, tutaj są oddzielone 4 spacjami):
Time Time Relative [s] N2[%] Time Time Relative [s] H2[ppm]
2/12/2013 9:20:55 AM 6.177 9.99268e+001 2/12/2013 9:20:55 AM 6.177 3.216293e-005
2/12/2013 9:21:06 AM 17.689 9.99296e+001 2/12/2013 9:21:06 AM 17.689 3.841667e-005
2/12/2013 9:21:18 AM 29.186 9.992954e+001 2/12/2013 9:21:18 AM 29.186 3.880365e-005
... etc ...
2/12/2013 2:12:44 PM 17515.269 9.991756+001 2/12/2013 2:12:44 PM 17515.269 2.800279e-005
2/12/2013 2:12:55 PM 17526.769 9.991754e+001 2/12/2013 2:12:55 PM 17526.769 2.880386e-005
2/12/2013 2:13:07 PM 17538.273 9.991797e+001 2/12/2013 2:13:07 PM 17538.273 3.131447e-005
import pandas as pd; pd.__version__
)read_table
w przykładzie, który stworzyłem.Odpowiedzi:
Istnieje jednowierszowe rozwiązanie problemu. Dotyczy to sytuacji, gdy nazwy niektórych kolumn są zduplikowane i chcesz je usunąć:
Jak to działa:
Załóżmy, że kolumny ramki danych to
['alpha','beta','alpha']
df.columns.duplicated()
zwraca tablicę logiczną: aTrue
lubFalse
dla każdej kolumny. Jeśli tak, toFalse
nazwa kolumny jest unikalna do tego momentu, jeśli tak, toTrue
nazwa kolumny jest zduplikowana wcześniej. Na przykład, używając podanego przykładu, zwrócona wartość będzie[False,False,True]
.Pandas
umożliwia indeksowanie przy użyciu wartości boolowskich, przy czym wybiera tylkoTrue
wartości. Ponieważ chcemy zachować nieuplikowane kolumny, potrzebujemy odwrócenia powyższej tablicy boolowskiej (tj.[True, True, False] = ~[False,False,True]
)Na koniec
df.loc[:,[True,True,False]]
wybiera tylko kolumny, które nie zostały zduplikowane, korzystając ze wspomnianej możliwości indeksowania.Uwaga : powyższe sprawdza tylko nazwy kolumn, a nie wartości kolumn.
źródło
df.T.drop_duplicates().T
.Wygląda na to, że znasz już unikalne nazwy kolumn. Jeśli tak jest, to
df = df['Time', 'Time Relative', 'N2']
zadziała.Jeśli nie, Twoje rozwiązanie powinno działać:
Prawdopodobnie masz coś specyficznego dla swoich danych, co je psuje. Moglibyśmy udzielić większej pomocy, gdybyś mógł podać nam więcej szczegółów na temat danych.
Edycja: Jak powiedział Andy, problem prawdopodobnie dotyczy zduplikowanych tytułów kolumn.
Dla przykładowego pliku tabeli „dummy.csv” przygotowałem:
użycie
read_table
daje unikalne kolumny i działa poprawnie:Jeśli twoja wersja na to nie pozwala, możesz zhakować rozwiązanie, aby uczynić je wyjątkowymi:
źródło
df['Time']
wybiera wszystkie szeregi czasowe (tj. Zwraca DataFrame), adf['Time', ..]
to zwróci cały DataFrame.RecursionError: maximum recursion depth exceeded
Transpozycja jest nieefektywna w przypadku dużych ramek danych. Oto alternatywa:
Użyj tego w ten sposób:
Edytować
Wersja oszczędzająca pamięć, która traktuje nans jak każdą inną wartość:
źródło
my_df.T.drop_duplicates().T
zawiesiłoby się na dużych ramkach danych./usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:17: DeprecationWarning: 'pandas.core.common.array_equivalent' is deprecated and is no longer public API
if array_equivalent(ia, ja):
zeif np.array_equal(ia, ja):
wydaje się produkować takie same wyniki, ale czytałem, że nie obsługuje Nans dobrze.array_equivalent
nadal dostępny w publicznym repozytorium, prawdopodobnie w starszej gałęzi?numpy.array_equiv
; w przypadku pand nie widzę żadnych wcześniejszych gałęzi wydań na GitHubie,pandas.core.common
ale być może są inne miejsca, w których można szukaćJeśli się nie mylę, poniższe robi to, o co pytano, bez problemów z pamięcią rozwiązania transponującego iz mniejszą liczbą wierszy niż funkcja @kalu, zachowując pierwszą z podobnie nazwanych kolumn.
źródło
Wygląda na to, że byłeś na dobrej drodze. Oto jeden wiersz, którego szukałeś:
Ale ponieważ nie ma przykładowej ramki danych, która generuje przywoływany komunikat o błędzie
Reindexing only valid with uniquely valued index objects
, trudno jest dokładnie powiedzieć, co dokładnie rozwiązałoby problem. jeśli przywracanie oryginalnego indeksu jest dla Ciebie ważne, wykonaj następujące czynności:źródło
Pierwszy krok: - Przeczytaj pierwszy wiersz, tj. Wszystkie kolumny, usuń wszystkie zduplikowane kolumny.
Drugi krok: - Na koniec przeczytaj tylko te kolumny.
źródło
Natknąłem się na ten problem, w którym jedna wkładka dostarczona przez pierwszą odpowiedź działała dobrze. Jednak miałem dodatkową komplikację polegającą na tym, że druga kopia kolumny zawierała wszystkie dane. Pierwsza kopia nie.
Rozwiązaniem było utworzenie dwóch ramek danych przez podzielenie jednej ramki danych poprzez przełączenie operatora negacji. Gdy miałem już dwie ramki danych, uruchomiłem instrukcję złączenia przy użyciu
lsuffix
. W ten sposób mogłem odwołać się i usunąć kolumnę bez danych.- E.
źródło
Poniższy sposób pozwoli zidentyfikować kolumny dupe, aby sprawdzić, co pierwotnie było nie tak podczas tworzenia ramki danych.
źródło
Szybki i łatwy sposób na usunięcie zduplikowanych kolumn według ich wartości:
df = df.T.drop_duplicates (). T
Więcej informacji: instrukcja Pandas DataFrame drop_duplicates .
źródło