我有类似以下数据框的状态和年份索引:
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
有更简洁的方法来获得此输出吗?
答案 0 :(得分:3)
您可以使用argsort
,它返回索引以对每列进行排序,将其应用于索引按升序排列索引:
d.apply(lambda x: x.index[x.argsort()])
如果您不想在数据框上保留原始索引,可以调用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