2015-01-07 2 views
5

Я хочу просто изменить порядок столбцов данного DataFrame.python pandas: reverse df column order

Мой DataFrame:

data = {'year': [2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012], 
    'team': ['Bears', 'Bears', 'Bears', 'Packers', 'Packers', 'Lions', 'Lions', 'Lions'], 
    'wins': [11, 8, 10, 15, 11, 6, 10, 4], 
    'losses': [5, 8, 6, 1, 5, 10, 6, 12]} 
football = pd.DataFrame(data, columns=['year', 'team', 'wins', 'losses']) 

Фактический выход:

year  team wins losses 
0 2010 Bears 11  5 
1 2011 Bears  8  8 
2 2012 Bears 10  6 
3 2011 Packers 15  1 
4 2012 Packers 11  5 
5 2010 Lions  6  10 
6 2011 Lions 10  6 
7 2012 Lions  4  12 

Я думал, что это будет работать, но это меняет порядок строка не столбец порядок:

football[::-1] 

Я также попытался:

football.columns = football.columns[::-1] 

, но это изменило метки столбцов, а не всю колонку.

ответ

9

Решение, близкое к тому, что вы уже пробовали использовать:

>>> football[football.columns[::-1]] 
    losses wins  team year 
0  5 11 Bears 2010 
1  8  8 Bears 2011 
2  6 10 Bears 2012 
3  1 15 Packers 2011 
4  5 11 Packers 2012 
5  10  6 Lions 2010 
6  6 10 Lions 2011 
7  12  4 Lions 2012 

football.columns[::-1] изменяет порядок последовательности в DataFrame в колонны, и football[...] reindexes в DataFrame с помощью этой новой последовательности.

Более лаконичный способ достичь того же есть с iloc индексатором:

football.iloc[:, ::-1] 

Первым : означает «взять все строки», то ::-1 означает шаг назад через колонку.

Указатель loc, упомянутый в ответе @ PietroBattiston, работает таким же образом.

1

Вы можете использовать фантазии индексации .ix, передать столбцы, а затем обратный список, чтобы изменить порядок:

In [27]: 

football.ix[::,football.columns[::-1]] 
Out[27]: 
    losses wins  team year 
0  5 11 Bears 2010 
1  8  8 Bears 2011 
2  6 10 Bears 2012 
3  1 15 Packers 2011 
4  5 11 Packers 2012 
5  10  6 Lions 2010 
6  6 10 Lions 2011 
7  12  4 Lions 2012 

тайминги

In [32]: 

%timeit football[football.columns[::-1]] 
1000 loops, best of 3: 421 µs per loop 
In [33]: 

%timeit football.ix[::,football.columns[::-1]] 
1000 loops, best of 3: 403 µs per loop 

фантазии индексации немного быстрее в этом случае

4

Близко к EdChum's answer ... но быстрее:

In [3]: %timeit football.ix[::,::-1] 
1000 loops, best of 3: 255 µs per loop 

In [4]: %timeit football.ix[::,football.columns[::-1]] 
1000 loops, best of 3: 491 µs per loop 

Также обратите внимание на один двоеточие избыточна:

In [5]: all(football.ix[:,::-1] == football.ix[::,::-1]) 
Out[5]: True 

EDIT: еще (минимальное) улучшение доводится с помощью .loc довольно чем .ix, как в football.loc[:,::-1].