Προσθήκη νέας στήλης σε υπάρχον 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 στο παραπάνω παράδειγμα;

Λύση

Χρησιμοποιήστε τους αρχικούς δείκτες df1 για να δημιουργήσετε τη σειρά:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

Επεξεργασία 2015 Κάποιοι ανέφεραν την εμφάνιση της προειδοποίησης SettingWithCopyWarning με αυτόν τον κώδικα.
Ωστόσο, ο κώδικας εξακολουθεί να εκτελείται άψογα με την τρέχουσα έκδοση 0.16.1 του pandas.

>>> sLength = len(df1['a'])
>>> df1
          a         b         c         d
6 -0.269221 -0.026476  0.997517  1.294385
8  0.917438  0.847941  0.034235 -0.448948

>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e
6 -0.269221 -0.026476  0.997517  1.294385  1.757167
8  0.917438  0.847941  0.034235 -0.448948  2.228131

>>> p.version.short_version
'0.16.1'

Η προειδοποίηση SettingWithCopyWarning έχει ως στόχο να ενημερώσει για μια πιθανώς άκυρη ανάθεση σε ένα αντίγραφο του Dataframe. Δεν'λέει απαραίτητα ότι το κάνατε λάθος (μπορεί να προκαλέσει ψευδώς θετικά αποτελέσματα) αλλά από την 0.13.0 σας ενημερώνει ότι υπάρχουν πιο κατάλληλες μέθοδοι για τον ίδιο σκοπό. Στη συνέχεια, αν λάβετε την προειδοποίηση, απλώς ακολουθήστε τις συμβουλές της: Δοκιμάστε να χρησιμοποιήσετε τη χρήση .loc[row_index,col_indexer] = value αντί για .loc[row_index,col_indexer] = value.

>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e         f
6 -0.269221 -0.026476  0.997517  1.294385  1.757167 -0.050927
8  0.917438  0.847941  0.034235 -0.448948  2.228131  0.006109
>>> 

Στην πραγματικότητα, αυτή είναι προς το παρόν η πιο αποτελεσματική μέθοδος, όπως περιγράφεται στα έγγραφα του pandas


Επεξεργασία 2017

Όπως αναφέρεται στα σχόλια και από τον @Alexander, επί του παρόντος η καλύτερη μέθοδος για να προσθέσετε τις τιμές μιας Σειράς ως νέα στήλη ενός DataFrame θα μπορούσε να είναι η χρήση του `assign:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
Σχόλια (27)

Αυτός είναι ο απλός τρόπος προσθήκης μιας νέας στήλης: df['e'] = e

Σχόλια (4)

Το να το κάνετε αυτό απευθείας μέσω του NumPy θα είναι το πιο αποτελεσματικό:

df1['e'] = np.random.randn(sLength)

Σημειώστε ότι η αρχική μου (πολύ παλιά) πρόταση ήταν να χρησιμοποιήσετε το map (το οποίο είναι πολύ πιο αργό):

df1['e'] = df1['a'].map(lambda x: np.random.random())
Σχόλια (2)