反转 DataFrame 列顺序
Reverse DataFrame 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]
但这颠倒了列标签而不是整个列本身。
注意:从Pandas v0.20开始,.ix
indexer is deprecated支持.iloc
/ .loc
.
您可以使用花式索引 .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
在这种情况下,花式索引稍微快一些
接近您已经尝试过的解决方案是使用:
>>> 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[...]
使用这个新序列重新索引 DataFrame。
实现相同目的的更简洁的方法是使用 iloc
索引器:
football.iloc[:, ::-1]
第一个:
表示"take all rows",::-1
表示向后退一步。
@PietroBattiston 的回答中提到的 loc
索引器以同样的方式工作。
注意:从Pandas v0.20开始,.ix
indexer is deprecated支持.iloc
/ .loc
.
接近 ...但更快:
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
编辑: 使用 .loc
而不是 .ix
带来了进一步的(最小)改进,如 football.loc[:,::-1]
.
我想简单地反转给定 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]
但这颠倒了列标签而不是整个列本身。
注意:从Pandas v0.20开始,.ix
indexer is deprecated支持.iloc
/ .loc
.
您可以使用花式索引 .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
在这种情况下,花式索引稍微快一些
接近您已经尝试过的解决方案是使用:
>>> 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[...]
使用这个新序列重新索引 DataFrame。
实现相同目的的更简洁的方法是使用 iloc
索引器:
football.iloc[:, ::-1]
第一个:
表示"take all rows",::-1
表示向后退一步。
@PietroBattiston 的回答中提到的 loc
索引器以同样的方式工作。
注意:从Pandas v0.20开始,.ix
indexer is deprecated支持.iloc
/ .loc
.
接近
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
编辑: 使用 .loc
而不是 .ix
带来了进一步的(最小)改进,如 football.loc[:,::-1]
.