【发布时间】:2016-02-16 18:23:15
【问题描述】:
我有一个大熊猫数据框,其中包含时间序列数据和相当大的多索引。所述索引包含有关时间序列的各种信息,例如位置、数据类型等。
现在我想在索引中添加一个新行,带有一个整数(或浮点数,并不重要),包含到某个点的距离。之后,我想按这个距离对数据框进行排序。
我不确定如何添加新的索引级别,以及如何手动分配新值。此外,pandas 甚至可以在其索引级别之一中对随机数之后的列进行排序吗?
示例
(来自here的代码)
header=pd.MultiIndex.from_product([['location1','location2'],['S1','S2','S3']],names=['loc','S'])
df = pd.DataFrame(np.random.randn(5, 6), index=['a','b','c','d','e'], columns = header)
看起来像这样:
loc location1 location2
S S1 S2 S3 S1 S2 S3
a 1.530590 0.536364 1.295848 0.422256 -1.853786 1.334981
b 0.275857 -0.848685 -1.212584 -0.464235 -0.855600 0.680985
c -1.209607 0.265359 -0.695233 0.643896 1.315216 -0.751027
d -1.591613 -0.178605 0.878567 0.647389 -0.454313 -1.972509
e 1.098193 -0.766810 0.087173 0.714301 -0.886545 -0.826163
我想要做的是,在第一步中,为每列添加一些距离,例如location1 S1 add dist 200、location1 S2 add dist 760 等等,结果如下:
loc location1 location2
S S1 S2 S3 S1 S2 S3
dist 200 760 10 1000 340 70
a 1.530590 0.536364 1.295848 0.422256 -1.853786 1.334981
b 0.275857 -0.848685 -1.212584 -0.464235 -0.855600 0.680985
c -1.209607 0.265359 -0.695233 0.643896 1.315216 -0.751027
d -1.591613 -0.178605 0.878567 0.647389 -0.454313 -1.972509
e 1.098193 -0.766810 0.087173 0.714301 -0.886545 -0.826163
然后执行df.sortlevel('dist')之类的操作,结果
loc location1 location2 location1 location2 location1 location2
S S3 S3 S1 S2 S2 S1
dist 10 70 200 340 760 1000
a 1.295848 1.334981 1.530590 -1.853786 0.536364 0.422256
b -1.212584 0.680985 0.275857 -0.855600 -0.848685 -0.464235
…
这样整个事情就按距离排序,比如plt.matshow(df.corr())。
pandas 甚至可以在带有整数的随机索引之后对 df 进行排序吗?因为我有另一个数据框,它的多重索引中已经有一个整数,这里some_otherdf.sortlevel('HZB') 结果为TypeError: can only sort by level with a hierarchical index
编辑:
到目前为止,有两个答案,对于我的测试用例来说,这两个答案都非常好。 我认为@Pedro M Duarte 的答案可能是更正确的答案,因为它按预期使用了多索引。但是,对于我的真实数据,对于 7 级深度的多索引和 50 个数据系列,它需要大量的返工或大量输入,这很容易出错。 @Nader Hisham 忽略了我保留在我的多索引中的请求,但它只需要快速、简单和容易地检查一行简单数字的写入(为我节省了很多时间),然后我可以在排序后将其删除。 对于有类似问题的其他人,可能会有所不同。
【问题讨论】:
标签: python sorting pandas indexing multi-index