Като се има предвид:
mi1 = MultiIndex.from_tuples([("bar", "y"), ("bar", "z"), ("baz", "y"), ("baz", "z"), ("foo", "y"), ("foo", "z")])
dfa = DataFrame(random.rand(6),index=mi1)
Как да сортираме по няколко колони и няколко нива на много индекс едновременно (в този случай нека кажем ниво 1 на multiindex и след това по колона 0
Знам, че бих могъл да разпространявам частичните многоиндикции в колони:
dfa[1] = zip(*dfa.index)[1]
dfa.sort(columns=[1,0])
Но как да го направите без тази стъпка на размножаване?
@ user2360798 има подобен въпрос, но никой не отговори на едновременното сортиране на колона / индексна част на въпроса: Да се сортира пандата на данните за стойностите на колоната и индекса?
Отговори:
3 за отговор № 1Лесно е, ако нулирате индекса.
Изградете своя индекс с имена (не е необходимо, но по-информативно)
In [23]: mi1 = MultiIndex.from_tuples([("bar", "y"), ("bar", "z"), ("baz", "y"), ("baz", "z"), ("foo", "y"), ("foo", "z")],names=["first","second"])
In [24]: dfa = DataFrame(np.random.randn(6),index=mi1)
In [25]: dfa
Out[25]:
0
first second
bar y 0.18574062599
z -0.82120720368
baz y -0.05645183973
z -1.07579609513
foo y -1.03528813447
z -0.46439965218
[6 rows x 1 columns]
Повторно задаване прави всички индекси в колони, сортиране, след което се връща
In [26]: dfa.reset_index().sort(columns=["second",0]).set_index(dfa.index.names)
Out[26]:
0
first second
foo y -1.03528813447
baz y -0.05645183973
bar y 0.18574062599
baz z -1.07579609513
bar z -0.82120720368
foo z -0.46439965218
[6 rows x 1 columns]
0 за отговор № 2
За пандата 0.23.0
е възможно сортиране колоните и индексите заедно:
mi1 = pd. MultiIndex.from_tuples([("bar", "y"), ("bar", "z"), ("baz", "y"), ("baz", "z"), ("foo", "y"), ("foo", "z")],names=["first","second"])
dfa = pd.DataFrame({"col":[1,4,5,6,1,2]},index=mi1)
print (dfa)
col
first second
bar y 1
z 4
baz y 5
z 6
foo y 1
z 2
df = dfa.sort_values(["second","col"])
print (df)
col
first second
bar y 1
foo y 1
baz y 5
foo z 2
bar z 4
baz z 6