/ Как да сортирате pandas dataframe по колони и част от multi index едновременно без да променяте dataframe - python, pandas

Как да сортирате pandas dataframe по колони и част от multi index едновременно без да променяте dataframe - python, pandas

Като се има предвид:

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