Çok satırlı bir düzlemin [0] seviyesini 1 düzeyine göre dilimlemek için birçok gönderi vardır. Ancak, benim sorunum için bir çözüm bulamıyorum; Yani, seviye [0] dizin değerleriPython Pandas multi multi-endeksini ikinci seviye dizinine (ya da başka bir düzeye) göre
veri çerçevesi için bir düzey 1 dizinine ihtiyacım var: Önce A'dan Z'ye, Rank 1'den 400'e; Her seviye için ilk 2 ve son 2'ye ihtiyacım var [0] (İlk), ancak aynı adımda değil.
Title Score
First Rank
A 1 foo 100
2 bar 90
3 lime 80
4 lame 70
B 1 foo 400
2 lime 300
3 lame 200
4 dime 100
aşağıda koduyla her seviye
1 endeksi için son 2 satır almaya çalışıyorum, ancak yalnızca birinci seviyede [0] değeri için düzgün dilimler.
[IN] df.ix[x.index.levels[1][-2]:]
[OUT]
Title Score
First Rank
A 3 lime 80
4 lame 70
B 1 foo 400
2 lime 300
3 lame 200
4 dime 100
ilk 2 satır Ben indeksleri değiştirerek olsun, ama son 2 satırlar için iş yapamazsınız. Bunu geri takas olabilir Tabii
df.index = df.index.swaplevel("Rank", "First")
df= df.sortlevel() #to sort by Rank
df.ix[1:2] #Produces the first 2 ranks with 2 level[1] (First) each.
Title Score
Rank First
1 A foo 100
B foo 400
2 A bar 90
B lime 300
bu almak için: endeksi 1 (Sıralama için
- Son 2 satır: Herhangi bir yardım aynı prosedüre almak için takdir edilmektedir
df2 = df.ix[1:2] df2.index = ttt.index.swaplevel("First","rank") #change the order of the indices back. df2.sortlevel() Title Score First Rank A 1 foo 100 2 bar 90 B 1 foo 400 2 lime 300
)
- Ve ilk 2 satırı almanın daha iyi bir yolu
Düzenleme:
pd.IndexSlice
kullanılması gerçekten kolay herhangi düzey endeksi dilim kolaylaştırır. Burada daha genel bir çözüm ve ilk ve son iki satırı elde etmek için adım adım yaklaşımımın altında. Burada daha fazla bilgi: http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers
"""
Slicing a dataframe at the level[2] index of the
major axis (row) for specific and at the level[1] index for columns.
"""
df.loc[idx[:,:,['some label','another label']],idx[:,'yet another label']]
"""
Thanks to @ako below is my solution, including how I
get the top and last 2 rows.
"""
idx = pd.IndexSlice
# Top 2
df.loc[idx[:,[1,2],:] #[1,2] is NOT a row index, it is the rank label.
# Last 2
max = len(df.index.levels[df.index.names.index("rank")]) # unique rank labels
last2=[x for x in range(max-2,max)]
df.loc[idx[:,last2],:] #for last 2 - assuming all level[0] have the same lengths.
, bu çözüm hem en temiz ve oldukça underappreciated görünüyor. –