Περισσότερα
Προσθήκη νέας στήλης σε υπάρχον DataFrame στην Python pandas
Έχω το ακόλουθο ευρετηριασμένο πλαίσιο δεδομένων με ονομαστικές στήλες και γραμμές μη συνεχών αριθμών:
a b c d
2 0.671399 0.101208 -0.181532 0.241273
3 0.446172 -0.243316 0.051767 1.577318
5 0.614758 0.075793 -0.451460 -0.012493
Θα ήθελα να προσθέσω μια νέα στήλη, 'e'
, στο υπάρχον πλαίσιο δεδομένων και δεν θέλω να αλλάξω τίποτα στο πλαίσιο δεδομένων (δηλαδή, η νέα στήλη έχει πάντα το ίδιο μήκος με το DataFrame).
0 -0.335485
1 -1.166658
2 -0.385571
dtype: float64
Δοκίμασα διαφορετικές εκδόσεις των join
, append
, merge
, αλλά δεν πήρα το αποτέλεσμα που ήθελα, παρά μόνο σφάλματα το πολύ. Πώς μπορώ να προσθέσω τη στήλη e
στο παραπάνω παράδειγμα;
882
3
Χρησιμοποιήστε τους αρχικούς δείκτες df1 για να δημιουργήσετε τη σειρά:
Επεξεργασία 2015 Κάποιοι ανέφεραν την εμφάνιση της προειδοποίησης
SettingWithCopyWarning
με αυτόν τον κώδικα.Ωστόσο, ο κώδικας εξακολουθεί να εκτελείται άψογα με την τρέχουσα έκδοση 0.16.1 του pandas.
Η προειδοποίηση
SettingWithCopyWarning
έχει ως στόχο να ενημερώσει για μια πιθανώς άκυρη ανάθεση σε ένα αντίγραφο του Dataframe. Δεν'λέει απαραίτητα ότι το κάνατε λάθος (μπορεί να προκαλέσει ψευδώς θετικά αποτελέσματα) αλλά από την 0.13.0 σας ενημερώνει ότι υπάρχουν πιο κατάλληλες μέθοδοι για τον ίδιο σκοπό. Στη συνέχεια, αν λάβετε την προειδοποίηση, απλώς ακολουθήστε τις συμβουλές της: Δοκιμάστε να χρησιμοποιήσετε τη χρήση .loc[row_index,col_indexer] = value αντί για .loc[row_index,col_indexer] = value.Στην πραγματικότητα, αυτή είναι προς το παρόν η πιο αποτελεσματική μέθοδος, όπως περιγράφεται στα έγγραφα του pandas
Επεξεργασία 2017
Όπως αναφέρεται στα σχόλια και από τον @Alexander, επί του παρόντος η καλύτερη μέθοδος για να προσθέσετε τις τιμές μιας Σειράς ως νέα στήλη ενός DataFrame θα μπορούσε να είναι η χρήση του `
assign
:Αυτός είναι ο απλός τρόπος προσθήκης μιας νέας στήλης:
df['e'] = e
Το να το κάνετε αυτό απευθείας μέσω του NumPy θα είναι το πιο αποτελεσματικό:
Σημειώστε ότι η αρχική μου (πολύ παλιά) πρόταση ήταν να χρησιμοποιήσετε το
map
(το οποίο είναι πολύ πιο αργό):