Mai mult
Adăugarea de noi coloane existente DataFrame în Python panda
Am urmatoarele indexate DataFrame cu nume de coloane și rânduri nu - continuă numere:
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
Aș dori să adăugați o nouă coloană, 'e'
, existente cadru de date și nu vreau să schimb nimic în cadru de date (de exemplu, noua coloană are întotdeauna aceeași lungime ca DataFrame).
0 -0.335485
1 -1.166658
2 -0.385571
dtype: float64
Am încercat diferite versiuni ale "se alăture", append
, merge
, dar nu am primit rezultatul am vrut, numai erori la mai mult. Cum pot adăuga coloana "e", pentru exemplul de mai sus?
882
22
Utilizare original df1 indici pentru a crea seria:
Edit 2015 Unii au raportat obtinerea `SettingWithCopyWarning cu acest cod. Cu toate acestea, codul încă rulează perfect cu actualul panda versiune 0.16.1.
Anii
SettingWithCopyWarning
își propune să informeze de un eventual invalid misiune pe o copie a Dataframe. Nu't spune neapărat că ai greșit (se poate declanșa alarme false) dar din 0.13.0 este să știi că acolo sunt mai adecvate metode pentru același scop. Apoi, dacă aveți de avertizare, trebuie doar să urmezi sale recomanda: Încercați să utilizați .loc[row_index,col_indexer] = valoareÎn fapt, aceasta este în prezent cea mai eficientă metodă ca descrise la panda docs
Edit 2017
După cum este indicat în comentariile și cu @Alexandru, în prezent cea mai bună metodă de a adăuga valorile dintr-o Serie, ca o nouă coloană de DataFrame ar putea fi folosind atribuie:
Acesta este modul simplu de a adăuga o nouă coloană:
df['e'] = e
Presupun că valorile indicelui în " e " se potrivesc cu cele din
df1
.Cel mai simplu mod de a iniția o nouă coloană numită "e", și atribuie valori din seria "e":
atribuirea (Panda 0.16.0+)
Ca de Panda 0.16.0, puteți utiliza, de asemenea,
atribui
, care atribuie noi coloane într-un DataFrame și returnează un obiect nou (o copie), cu toate coloanele original în plus față de cele noi.Ca pe acest exemplu (care include, de asemenea, codul sursă al atribuie funcția), puteți include, de asemenea, mai mult de o coloană:
În context cu exemplu:
Descrierea de această nouă caracteristică atunci când a fost introdus pentru prima dată pot fi găsite aici.
Se pare că în ultimii Panda versiuni mod de a merge este de a folosi df.assign:
df1 = df1.aloca(e=np.aleatoare.randn(sLength))
Nu't produc
SettingWithCopyWarning
.Face acest lucru în mod direct, prin intermediul NumPy va fi cel mai eficient:
Nota mea original (foarte vechi), sugestie a fost de a utiliza "harta" (care este mult mai lent):
Super-simplu coloana misiune
Un panda dataframe este implementat ca un comandat dict de coloane.
Acest lucru înseamnă că
__getitem__
[]
nu poate fi utilizat doar pentru a obține o anumită coloană, dar__setitem__
[] =
poate fi folosit pentru a atribui o nouă coloană.De exemplu, acest dataframe poate avea o coloană de adăugat la simplu, cu ajutorul
[]
accesorRețineți că aceasta funcționează chiar și în cazul în care indicele de dataframe este oprit.
[]= este calea de a merge, dar ai grija!
Cu toate acestea, dacă aveți un pd.Seria` și să încerce să atribuiți-l la un dataframe în cazul în care indicii sunt stinse, va rula în probleme. A se vedea de exemplu:
Acest lucru este pentru că un pd.Seria implicit are un indice enumerate la 0 la n. Și panda
[] =
metode de încercări pentru a fi "inteligent"Ce de fapt se întâmplă.
Atunci când utilizați
[] =
metoda panda este liniște efectuează un exterior alătura sau exterior îmbinare folosind indexul de la mâna stângă dataframe și indexul de la mâna dreaptă serie.df['coloana'] = seria
Notă
Acest lucru provoacă rapid disonanță cognitivă, deoarece
[]=
metoda este încercarea de a face o mulțime de lucruri diferite în funcție de intrare, iar rezultatul nu poate fi anticipat dacă nu știu doar cum panda funcționează. Prin urmare, aș sfaturi împotriva[]=
în codul de baze, dar atunci când explorarea datelor într-un notebook, este bine.Întâmplă în jurul valorii de problema
Dacă aveți un pd.Serie și vrei atribuit de sus în jos, sau dacă sunteți de codificare productive cod și nu sunteți sigur de indicele scopul, este în valoare de ea pentru a proteja de acest tip de problema.
Ai putea să plecați la pd.Seria
la un
np.ndarray` sau o "listă", acest lucru va face truc.sau
Dar acest lucru nu este foarte explicit.
Un programator poate să vină și să spună "Hei, acest lucru pare redundant, am'll doar optimiza această distanță".
Mod Explicit
Stabilirea indicelui de pd.Seria a fi indicele de " df " este explicită.
Sau mai realist, probabil ai un pd.Seria deja disponibile.
Poate fi acum atribuite
Cale alternativă cu df.reset_index()`
Deoarece indicele de disonanță este problema, dacă vă simțiți că indicele de dataframe ar trebui să nu dicta lucruri, puteți pur și simplu drop index, acest lucru ar trebui să fie mai rapid, dar nu este foarte curat, deoarece funcția ta acum, probabil, ** face două lucruri.
Notă pe df.atribui`
În timp ce
df.atribuie face mai explicită ceea ce faci, de fapt, ea are toate aceleași probleme ca cele de mai sus
[]=`Doar ai grija cu
df.trimit in care coloana ta nu este numit "sine". Aceasta va provoca erori. Acest lucru face
df.atribui` pucioasa, de când există aceste tipuri de artefacte din funcție.S-ar putea spune, "ei Bine, am'll nu folosi "sine" apoi". Dar cine știe cum această funcție modificări în viitor, pentru a sprijini noi argumente. Poate că numele coloanei va fi un argument într-un nou update de panda, care cauzează probleme cu actualizarea.
Dacă doriți să setați nouă coloană la o primă valoarea de bază (de exemplu, "Nici unul"), puteți face acest lucru:
df1['e'] = None
Acest fapt s-ar atribui "obiect" tip de celula. Așa că mai târziu te're liber pentru a pune tipuri de date complexe, cum ar fi lista, în celule individuale.
Mai simple moduri:-
M-am temut
SettingWithCopyWarning
, și nu a fost't fixate cu ajutorul iloc de sintaxă. Mi DataFrame a fost creat de read_sql dintr-o sursă ODBC. Folosind o sugestie de lowtech de mai sus, următoarele au lucrat pentru mine:Aceasta a lucrat bine pentru a introduce coloana la sfârșitul anului. Eu nu't știu dacă este cel mai eficient, dar eu nu't ca mesajele de avertizare. Cred că există o soluție mai bună, dar nu pot't găsi, și cred că depinde de unele aspecte ale indicelui. Nota. Că acest lucru funcționează doar o singură dată și va da un mesaj de eroare dacă încercați să suprascrieți și coloană existente. Notă Ca mai sus și de la 0.16.0 atribui este cea mai bună soluție. A se vedea documentația http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign Funcționează bine pentru fluxul de date de tip în cazul în care nu't suprascrie valorile intermediare.
list_of_e
care are date relevante.df['e'] = list_of_e
Dacă coloana sunteți încercarea de a adăuga o serie de variabile, atunci doar :
Acest lucru funcționează bine, chiar dacă înlocuiți o coloană existente.trebuie doar să tastați new_columns_name același ca și coloana pe care doriți să înlocuiți.Acesta va suprascrie existente coloană de date cu noi serii de date.
Foarte simplu de manevrat:
Exemplu:
Dacă cadrului de date și Seria obiect au același index, `panda.concat, de asemenea, funcționează aici:
În cazul în care acestea nu't au același indice:
Un lucru de remarcat, totuși, este că, dacă ai face
aceasta va fi efectiv o custanga alăturați-vă pe df1.index. Deci, dacă vrei să ai o exterior** alăturați-efect, probabil, imperfect soluție este de a crea un dataframe cu valori ale indicelui de acoperire univers de date, și apoi folositi codul de mai sus. De exemplu,
Înainte de a atribui o nouă coloană, dacă aveți indexate de date, aveți nevoie pentru a sorta index. Cel puțin în cazul meu am avut de a:
Permiteți-mi să adaug că, la fel ca pentru hum3,
.loc
n't rezolvaSettingWithCopyWarning și a trebuit să recurgă la
df.insert(). În cazul meu fals pozitiv a fost generat de "fals" lanț de indexare
dict['o']['e']", unde " 'e'este cea mai nouă coloană, și
dict['un']` este un DataFrame vine din dicționar.De asemenea, rețineți că, dacă știi ceea ce faci, puteți comuta de avertizare, folosind pd.opțiuni.modul.chained_assignment = None` și decât să-l utilizați una dintre celelalte soluții oferite aici.
Am fost în căutarea pentru un mod general de a adăuga o coloană de
numpy.nan pentru o dataframe, fără a se mut
SettingWithCopyWarning`.Din cele următoarele:
numpy
matrice de NaNs în linieAm venit cu asta:
pentru a insera o nouă coloană la o anumită locație (0 <= loc <= cantitatea de coloane), într-un cadru de date, trebuie doar să utilizați Dataframe.insert:
Prin urmare, dacă doriți să adăugați coloana e la sfârșitul unui cadru de date numit df, puteți folosi:
valoare poate fi o Serie, un număr întreg (în cazul în care toate celulele se umplu cu aceasta valoare), sau o mulțime-ca structura
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.insert.html
Pentru a adăuga o nouă coloană, 'e', a datelor existente cadru
Pentru motive de exhaustivitate - încă o soluție folosind DataFrame.eval() metoda:
Date:
Soluție: