Veri çerçevesini sıraladıktan sonra dizini güncelle


102

Aşağıdaki veri çerçevesini alın:

x = np.tile(np.arange(3),3)
y = np.repeat(np.arange(3),3)
df = pd.DataFrame({"x": x, "y": y})
   x  y
0  0  0
1  1  0
2  2  0
3  0  1
4  1  1
5  2  1
6  0  2
7  1  2
8  2  2

İlkine göre sıralamalıyım xve sadece ikinci olarak y:

df2 = df.sort(["x", "y"])
   x  y
0  0  0
3  0  1
6  0  2
1  1  0
4  1  1
7  1  2
2  2  0
5  2  1
8  2  2

Dizini tekrar yükselecek şekilde nasıl değiştirebilirim? Yani bunu nasıl elde ederim:

   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

Aşağıdakileri denedim. Maalesef, dizini hiç değiştirmiyor:

df2.reindex(np.arange(len(df2.index)))

1
Yeni bir df'ye ihtiyacınız yoksa deneyindf.sort(["x", "y"], ignore_index=True, inplace=True)
InnocentBystander

Yanıtlar:


175

Sen edebilirsiniz reset kullanarak indeksi reset_index0, 1, 2 varsayılan dizini geri almak için, ..., n-1 (ve kullanım drop=TrueBunun yerine dataframe ek bir sütun olarak eklemeden mevcut dizini bırakın istediğiniz belirtmek için) :

In [19]: df2 = df2.reset_index(drop=True)

In [20]: df2
Out[20]:
   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

Bu çok yardımcı oldu. exp_data = exp_data.reindex (['yıl'], eksen = 'sütunlar') eski dizini korudu. Bırak, eski dizini kaldırır.
Altın Aslan


10

Pandas 1.0.0 df.sort_values, ignore_indextam olarak ihtiyacınız olanı yapan yeni bir parametreye sahip olduğundan:

In [1]: df2 = df.sort_values(by=['x','y'],ignore_index=True)

In [2]: df2
Out[2]:
   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

Bunun 1.0.0 sürümünde yeni olduğunu düşünüyorum.
zyy

5

Şunları kullanarak yeni endeksler belirleyebilirsiniz set_index:

df2.set_index(np.arange(len(df2.index)))

Çıktı:

   x  y
0  0  0
1  0  1
2  0  2
3  1  0
4  1  1
5  1  2
6  2  0
7  2  1
8  2  2

8
Bu gereksiz, reset_index()onun yerine kullanın
smci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.