2015-10-19 15 views
5

Czytałem dane z pliku csv do ramki danych składającej się z więcej niż 25000 wierszy i 15 kolumn i muszę przenieść wszystkie wiersze (w tym lewy-pierwszy -> indeks) jedną kolumnę do tak, że otrzymuję pusty indeks i mogę wypełnić go liczbami całkowitymi. Nazwy kolumn powinny jednak pozostawać w tym samym miejscu. Tak więc, zasadniczo muszę przenieść wszystko z wyjątkiem nazw kolumn z jednego miejsca na prawo.Przenoszenie kolumn w Pandach DATA FRAME

enter image description here

Próbowałem go reindex, ale mam błąd:

ValueError: cannot reindex from a duplicate axis 

Czy istnieje jakiś sposób, aby to zrobić?

Odpowiedz

4

Chciałbym najpierw dodać nową kolumnę z:

df['new'] = df.index 

niż brać nazwy kolumn swojej dataframe w postaci listy z:

colnames = df.columns.tolist() 

Następnie można zmienić je jak trzeba , na przykład zmieniając kolejność, aby uzyskać ostatnią "nową" kolumnę jako pierwszą i przesunąć pozostałą jedną pozycję w prawo:

colnames = colnames[-1:] + colnames[:-1] 

i przypisanie:

df = df[colnames] 
+0

I zostały zaktualizowane, teraz jest to bardziej oczywiste. – puk789

9

W pandy można tworzyć tylko kolumnę w prawo, o ile nie ma połączenia pomiędzy dwoma dataframe. Następnie możesz ponownie ustawić, jak chcesz.

import pandas as pd 

df = pd.read_csv('data.csv', header=None, names = ['A','B','C']) 

print(df) 

    A B C 
0 1 2 3 
1 4 5 6 
2 7 8 9 
3 10 11 12 

df['D'] = pd.np.nan # this creates an empty series 
        # and appends to the right 

print(df) 

    A B C D 
0 1 2 3 NaN 
1 4 5 6 NaN 
2 7 8 9 NaN 
3 10 11 12 NaN 

df = df[['D','A','B','C']] # rearrange as you like 

print(df) 

    D A B C 
0 NaN 1 2 3 
1 NaN 4 5 6 
2 NaN 7 8 9 
3 NaN 10 11 12 
+0

'df ['D'] = pd.np.nan' wystarczyłoby zamiast' df ['D'] = pd.Series (dane = brak, index = df.index) '? – Zero

+0

Dziękuję, zaktualizowane. – Leb

+0

Zaktualizowałem to, teraz jest bardziej przejrzyste. – puk789

0
df = YourDataFrame 
col = "Your Column You Want To Move To The Start Of YourDataFrame" 
df = pd.concat([df[col],df.drop(col,axis=1)], axis=1)