Έχω το ακόλουθο 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
...
Το DataFrame διαβάζεται από ένα αρχείο csv. Όλες οι γραμμές που έχουν Type
1 είναι στην κορυφή, ακολουθούμενες από τις γραμμές με Type
2, ακολουθούμενες από τις γραμμές με Type
3, κλπ.
Θα ήθελα να ανακατέψω τη σειρά των γραμμών του DataFrame's, έτσι ώστε όλοι οι Type
's να είναι ανάμεικτοι. Ένα πιθανό αποτέλεσμα θα μπορούσε να είναι:
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
...
Πώς μπορώ να το επιτύχω αυτό;
Ο ειδικός τρόπος για να το κάνετε αυτό με το pandas είναι να χρησιμοποιήσετε τη μέθοδο .sample
του πλαισίου δεδομένων σας, δηλαδή.
df.sample(frac=1)
Το όρισμα της λέξης-κλειδί frac
καθορίζει το κλάσμα των γραμμών που θα επιστραφούν στο τυχαίο δείγμα, οπότε frac=1
σημαίνει επιστροφή όλων των γραμμών (με τυχαία σειρά).
Σημείωση: Αν θέλετε να ανακατέψετε το πλαίσιο δεδομένων σας στη θέση του και να επαναφέρετε το δείκτη, μπορείτε να κάνετε π.χ.
df = df.sample(frac=1).reset_index(drop=True)
Εδώ, ο προσδιορισμός drop=True
αποτρέπει την .reset_index
από το να δημιουργήσει μια στήλη που περιέχει τις παλιές καταχωρήσεις ευρετηρίου.
Συνεχής σημείωση: Αν και μπορεί να μη φαίνεται ότι η παραπάνω λειτουργία είναι εντός του χώρου, η python/pandas είναι αρκετά έξυπνη ώστε να μην κάνει άλλη malloc για το ανακατεμένο αντικείμενο. Δηλαδή, παρόλο που το αντικείμενο αναφοράς έχει αλλάξει (με αυτό εννοώ ότι το id(df_old)
δεν είναι το ίδιο με το id(df_new)
), το υποκείμενο αντικείμενο C εξακολουθεί να είναι το ίδιο. Για να δείξετε ότι αυτό όντως συμβαίνει, μπορείτε να εκτελέσετε έναν απλό memory profiler:
$ python3 -m memory_profiler .\test.py
Όνομα αρχείου: .\test.py
Γραμμή # Χρήση μνήμης Αύξηση Περιεχόμενα γραμμής
================================================
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)
Μπορείτε απλά να χρησιμοποιήσετε το sklearn για αυτό
from sklearn.utils import shuffle
df = shuffle(df)
Μπορείτε να ανακατέψετε τις γραμμές ενός πλαισίου δεδομένων με ευρετηρίαση με ένα ανακατεμένο ευρετήριο. Για το σκοπό αυτό, μπορείτε π.χ. να χρησιμοποιήσετε το np.random.permutation
(αλλά και το np.random.choice
είναι επίσης μια δυνατότητα):
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 όπως στο παράδειγμά σας, μπορείτε απλά να επαναφέρετε το ευρετήριο: df_shuffled.reset_index(drop=True)