按数据框列值获取有序索引

时间:2017-03-17 18:20:43

标签: python pandas

我有类似以下数据框的状态和年份索引:

import pandas as pd

d = pd.DataFrame(index=['CA', 'WA', 'OR', 'NV'])
d[2015]=[100, 200, 40, 75]
d[2016]=[1000, 20, 25, 12]
print d
    2015  2016
CA   100  1000
WA   200    20
OR    40    25
NV    75    12

我想要一个新的数据框,其中索引是该年度每个州的排名,值是排名顺序的状态。

我可以得到如下输出:

pd.DataFrame([d.sort_values(x).index for x in d.columns], index=d.columns, columns=range(1,len(d)+1)).transpose()
Out[57]: 
  2015 2016
1   OR   NV
2   NV   WA
3   CA   OR
4   WA   CA

有更简洁的方法来获得此输出吗?

2 个答案:

答案 0 :(得分:3)

您可以使用argsort,它返回索引以对每列进行排序,将其应用于索引按升序排列索引:

d.apply(lambda x: x.index[x.argsort()])

enter image description here

如果您不想在数据框上保留原始索引,可以调用reset_index(drop=True)

答案 1 :(得分:2)

带有令人讨厌的格式化

d.apply(pd.Series.rank).stack().reset_index(0, name='x') \
    .set_index('x', append=True).squeeze() \
    .unstack(0).rename_axis(None).rename(index=int)

  2015 2016
1   OR   NV
2   NV   WA
3   CA   OR
4   WA   CA

numpy

更好
a = d.values.argsort(0)

pd.DataFrame(d.index.values[a], range(1, len(d) + 1), d.columns)

  2015 2016
1   OR   NV
2   NV   WA
3   CA   OR
4   WA   CA