Usuwanie kolumny indeksu w pandach podczas czytania pliku CSV

128

Mam następujący kod, który importuje plik CSV. Istnieją 3 kolumny i chcę ustawić dwie pierwsze z nich na zmienne. Kiedy ustawię drugą kolumnę na zmienną „wydajność”, kolumna indeksu również zostanie dołączona. Jak pozbyć się kolumny indeksu?

df = pd.DataFrame.from_csv('Efficiency_Data.csv', header=0, parse_dates=False)
energy = df.index
efficiency = df.Efficiency
print efficiency

Próbowałem użyć

del df['index']

po ustawieniu

energy = df.index

które znalazłem w innym poście, ale skutkuje to „KeyError: 'index'”

Bogdan Janiszewski
źródło

Odpowiedzi:

70

Ramki danych i serie zawsze mają indeks. Chociaż wyświetla się obok kolumn, nie jest to kolumna, dlatego właśniedel df['index'] nie działa.

Jeśli chcesz zastąpić indeks prostymi kolejnymi liczbami, użyj df.reset_index() .

Aby zrozumieć, dlaczego indeks istnieje i jak jest używany, zobacz np. 10 minut do Pand .

Dan Allan
źródło
1
Dzięki! Postanowiłem po prostu zaimportować to w inny sposób, nie używając pand. Muszę wykonać pewne obliczenia na każdej z kolumn, a Pythonowi nie podobało się, że ma dołączoną kolumnę indeksu. Pandy to z pewnością najłatwiejszy sposób importowania danych, ale nie zawsze najlepszy, jaki odkryłem.
Bogdan Janiszewski
2
Czy próbowałeś użyć Pand do wykonania arytmetyki?
Jamie Bull,
1
czy można usunąć nazwę indeksu?
Quant
3
Tak index.name = None.
Dan Allan
1
@BogdanJaniszewski, jeśli nie używałeś pand, to dlaczego przyjąłeś to jako odpowiedź?
multigoodverse
251

Podczas czytania do iz pliku CSV dołącz argument, index=Falsewięc na przykład:

 df.to_csv(filename, index=False)

i czytać z csv

df.read_csv(filename, index=False)  

Powinno to zapobiec problemowi, więc nie musisz go później naprawiać.

Steve
źródło
8
Wielkie dzięki. Właśnie tego dotyczy pytanie.
Pale Blue Dot
1
„header = False” działa przy usuwaniu nagłówków w ten sam sposób
J.Dahlgren,
29
powinno być index_col=False.
Vedda,
1
Użycie df.to_sql("table",cursor,if_exists="append",index=False)również naprawia błąd sqlitesqlite3.OperationalError: table message has no column named index
Anna,
1
@vedda wydaje się być index=Falsedla to_excel()i index_col=Falsez read_csv()w pandach 0.23.4. : - /
matt wilkie
70

df.reset_index(drop=True, inplace=True)

Subhojit Mukherjee
źródło
2
To właściwie moje ulubione rozwiązanie, ale niezbyt rozbudowana odpowiedź. W instrukcji czytamy o argumencie drop: "Nie próbuj wstawiać indeksu do kolumn dataframe. Spowoduje to zresetowanie indeksu do domyślnego indeksu całkowitego." pandas.pydata.org/pandas-docs/stable/generated/…
tommy.carstensen
@ tommy.carstensen W takim razie w jaki sposób można by uniknąć pobierania liczb całkowitych w indeksie jako zamiennika poprzedniego indeksu? Myślę, że to nieporozumienie tekstu twojego linku. Chodzi o to, aby porzucić indeks . I to jest osiągnięte tutaj. Otrzymujesz domyślne liczby całkowite, ponieważ nie ma ramki dat bez indeksu, ale poprzedni indeks został usunięty. Dlatego ta odpowiedź powinna być akceptowaną odpowiedzią, także dlatego, że wykorzystuje wydajną pamięć inplace=True.
Lorenz
13

Możesz ustawić jedną z kolumn jako indeks, na przykład w przypadku, gdy jest to „identyfikator”. W takim przypadku kolumna indeksu zostanie zastąpiona jedną z wybranych kolumn.

df.set_index('id', inplace=True)
Natheer Alabsi
źródło
3

Jeśli twój problem jest taki sam jak mój, gdzie chcesz po prostu zresetować nagłówki kolumn z 0 do rozmiaru kolumny. Robić

df = pd.DataFrame(df.values);

EDYTOWAĆ:

Nie jest to dobry pomysł, jeśli masz heterogeniczne typy danych. Lepiej po prostu użyj

df.columns = range(len(df.columns))
Bhanu Pratap Singh
źródło
2

możesz określić która kolumna jest indeksem w Twoim pliku csv używając parametru index_col funkcji from_csv jeśli to nie rozwiąże problemu podaj przykładowe dane

yemu
źródło
2

df=df.reset_index() Wtedy robię jedną rzeczdf=df.drop(['index'],axis=1)

Lord Varis
źródło
Błąd: „etykiety ['indeks'] nie są zawarte w osi”
Vasin Yuriy
@VasinYuriy to oznacza df.reset_index().drop(columns=['yourfirstindex', 'yoursecondindex']), że działa z „indeksem” tylko w standardowym przypadku, gdy indeks nie ma nazwy, a następnie staje się kolumną o nazwie „indeks” z df.reset_index().drop(columns=['index']). Dodany parametr axis=1jest wartością domyślną. Ta metoda nie jest zalecana, @ SubhojitMukherjee reset_index(inplace=True)działa „inplace”, a tym samym oszczędza pamięć.
Lorenz