Ik heb de volgende DataFrame:
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
...
Het DataFrame wordt ingelezen uit een csv bestand. Alle rijen die Type
1 hebben staan bovenaan, gevolgd door de rijen met Type
2, gevolgd door de rijen met Type
3, enz.
Ik zou graag de volgorde van de rijen van de DataFrame's willen verschuiven, zodat alle Type
's door elkaar staan. Een mogelijk resultaat zou kunnen zijn:
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
...
Hoe kan ik dit bereiken?
De idiomatische manier om dit te doen met pandas is om de .sample
methode van je dataframe te gebruiken, d.w.z.
``python
df.sample(frac=1)
Het `frac` keyword argument specificeert de fractie van rijen om terug te geven in de random steekproef, dus `frac=1` betekent alle rijen teruggeven (in willekeurige volgorde).
----------
**Noot:**
Als u uw dataframe in-place wilt shuffelen en de index wilt resetten, kunt u bijv.
``python
df = df.sample(frac=1).reset_index(drop=True)
Hier, het specificeren van drop=True
voorkomt dat .reset_index
een kolom aanmaakt met de oude index ingangen.
Volgende opmerking: Hoewel het er misschien niet op lijkt dat de bovenstaande operatie in-place is, is python/pandas slim genoeg om niet nog een malloc te doen voor het geschudde object. Dat wil zeggen, ook al is het referentie object veranderd (waarmee ik bedoel dat id(df_old)
niet hetzelfde is als id(df_new)
), het onderliggende C object is nog steeds hetzelfde. Om aan te tonen dat dit inderdaad het geval is, zou je een eenvoudige geheugen profiler kunnen draaien:
$ python3 -m memory_profiler .\test.py
Bestandsnaam: .\test.py
Regel # geheugengebruik Regelinhoud verhogen
================================================
5 68.5 MiB 68.5 MiB @profile
6 def shuffle():
7 847.8 MiB 779.3 MiB df = pd.DataFrame(np.random.randn(100, 1000000))
8 847.9 MiB 0.1 MiB df = df.sample(frac=1).reset_index(drop=True)
Je kunt de rijen van een dataframe shuffelen door te indexeren met een shuffled index. Hiervoor kun je b.v. np.random.permutation
gebruiken (maar np.random.choice
is ook een mogelijkheid):
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
Als u de index genummerd wilt houden van 1, 2, ..., n zoals in uw voorbeeld, kunt u de index gewoon resetten: df_shuffled.reset_index(drop=True)