2015-04-11 16 views
110

Aşağıdaki DataFrame vardır: DataFrame bir csv dosyasından okunurKarışık DataFrame satırları

Col1 Col2 Col3 Type 
0  1  2  3  1 
1  4  5  6  1 
... 
20  7  8  9  2 
21 10 11 12  2 
... 
45 13 14 15  3 
46 16 17 18  3 
... 

. Type 3 ile satırın takip Type 2 ile satırın takip Type 1 üstte olan tek şey satırlar, vb

Bütün Type 'ler karıştırılır ve böylece, DataFrame satırlarını karıştırmak istiyorum. Olası bir sonucu olabilir:

Col1 Col2 Col3 Type 
0  7  8  9  2 
1  13 14 15  3 
... 
20  1  2  3  1 
21 10 11 12  2 
... 
45  4  5  6  1 
46 16 17 18  3 
... 

sonucundan görülebileceği gibi, satır sırası karıştırılır, ancak sütunlar aynı kalır. Bunu açık bir şekilde açıklamam mı bilmiyorum. Yapmazsam haberim olsun.

Bunu nasıl başarabilirim?

cevap

230

pandalar ile bunu daha deyimsel yolu yani senin dataframe ait .sample yöntemini kullanmaktır

df.sample(frac=1) 

frac kelime argüman satır bölümünü belirtir rastgele örneklemde dönmek için frac=1 tüm satırları (rastgele sırayla) döndürür.

Not: sen yerinde sizin dataframe karıştırmak ve dizini sıfırlamak isterseniz, örneğin yapabileceği drop=True belirten Burada

df = df.sample(frac=1).reset_index(drop=True) 

eski dizin girişleri ihtiva eden bir sütun oluşturmasını .reset_index önler.

+1

Re için sklearn kullanabilirsiniz. ** not **, 'sample()' metodunun inplace 'parametresi yoktur, bu yüzden (şu anda) yeni bir nesne oluşturmadan önerdiğiniz şeyi yapmak mümkün değildir. –

+0

@ m-dz Önerdiğim şeyi gerçekten okudunuz mu? – Kris

+0

Yukarıdaki alıntı "Not: Veri çerçevenizi yerinde karıştırmak istiyorsanız [...]". –

35

Bir veri dizisinin satırlarını karıştırılmış bir dizinle dizine ekleyerek karıştırabilirsiniz. Bunun için, örneğin np.random.permutation kullanabilirsiniz (ancak np.random.choice bir olasılık da): Eğer kadar numaralandırılmış endeksi tutmak istiyorsanız

In [12]: df = pd.read_csv(StringIO(s), sep="\s+") 

In [13]: df 
Out[13]: 
    Col1 Col2 Col3 Type 
0  1  2  3  1 
1  4  5  6  1 
20  7  8  9  2 
21 10 11 12  2 
45 13 14 15  3 
46 16 17 18  3 

In [14]: df.iloc[np.random.permutation(len(df))] 
Out[14]: 
    Col1 Col2 Col3 Type 
46 16 17 18  3 
45 13 14 15  3 
20  7  8  9  2 
0  1  2  3  1 
1  4  5  6  1 
21 10 11 12  2 

1, 2, .., n sizin örnekte olduğu gibi, sadece sıfırlayabilirsiniz endeksi: df_shuffled.reset_index(drop=True)

62

Sadece bu

from sklearn.utils import shuffle 
df = shuffle(df)