Έχω δημιουργήσει ένα Pandas DataFrame
df = DataFrame(index=['A','B','C'], columns=['x','y'])
και πήρα αυτό <pre>, x y A NaN NaN B NaN NaN NaN C NaN NaN NaN </pre>, <br>, Στη συνέχεια, θέλω να εκχωρήσω τιμή σε συγκεκριμένο κελί, για παράδειγμα για τη γραμμή 'C' και τη στήλη 'x'. Περίμενα να λάβω ένα τέτοιο αποτέλεσμα: <pre>, x y A NaN NaN NaN B NaN NaN NaN C 10 NaN </pre>,
με αυτόν τον κώδικα:
df.xs('C')['x'] = 10
αλλά τα περιεχόμενα του df
δεν έχουν αλλάξει. Είναι και πάλι μόνο NaN
στο DataFrame.
Καμία πρόταση;
Η απάντηση της RukTech's, df.set_value('C', 'x', 10)
, είναι μακράν πιο γρήγορη από τις επιλογές που έχω προτείνει παρακάτω. Ωστόσο, έχει αποχαρακτηριστεί.
Στο μέλλον, η συνιστώμενη μέθοδος είναι η .iat/.at
.
Γιατί δεν δουλεύει το df.xs('C')['x']=10
:
Το df.xs('C')
από προεπιλογή, επιστρέφει ένα νέο πλαίσιο δεδομένων με ένα αντίγραφο των δεδομένων, οπότε
df.xs('C')['x']=10
τροποποιεί μόνο αυτό το νέο πλαίσιο δεδομένων.
Το df['x']
επιστρέφει μια προβολή του πλαισίου δεδομένων df
, οπότε
df['x']['C'] = 10
τροποποιεί το ίδιο το df
.
Προειδοποίηση: Μερικές φορές είναι δύσκολο να προβλέψουμε αν μια λειτουργία επιστρέφει ένα αντίγραφο ή μια προβολή. Για το λόγο αυτό τα έγγραφα συνιστούν να αποφεύγονται οι αναθέσεις με "chained indexing".
Έτσι, η συνιστώμενη εναλλακτική λύση είναι
df.at['C', 'x'] = 10
η οποία δεν τροποποιεί το df
.
In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop
In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop
In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
Ενημέρωση: Η μέθοδος .set_value
πρόκειται να καταργηθεί. Οι .iat/.at
είναι καλές αντικαταστάσεις, δυστυχώς το pandas παρέχει ελάχιστη τεκμηρίωση.
Ο γρηγορότερος τρόπος για να γίνει αυτό είναι η χρήση της set_value. Αυτή η μέθοδος είναι ~100 φορές ταχύτερη από τη μέθοδο .ix
. Για παράδειγμα:
C', 'x', 10)`
Ο συνιστώμενος τρόπος (σύμφωνα με τους συντηρητές) για να ορίσετε μια τιμή είναι:
df.ix['x','C']=10
Η χρήση της 'αλυσιδωτής ευρετηρίασης' (df['x']['C']
) μπορεί να οδηγήσει σε προβλήματα.
Βλέπε: