Ik heb een Pandas-dataframe zoals hieronder:
itm Date Amount
67 420 2012-09-30 00:00:00 65211
68 421 2012-09-09 00:00:00 29424
69 421 2012-09-16 00:00:00 29877
70 421 2012-09-23 00:00:00 30990
71 421 2012-09-30 00:00:00 61303
72 485 2012-09-09 00:00:00 71781
73 485 2012-09-16 00:00:00 NaN
74 485 2012-09-23 00:00:00 11072
75 485 2012-09-30 00:00:00 113702
76 489 2012-09-09 00:00:00 64731
77 489 2012-09-16 00:00:00 NaN
Als ik een functie probeer toe te passen op de kolom Bedrag, krijg ik de volgende foutmelding:
ValueError: cannot convert float NaN to integer
Ik heb geprobeerd een functie toe te passen met .isnan uit de Math Module
Ik heb het panda’s .replace attribuut geprobeerd
Ik probeerde het .sparse data-attribuut van panda’s 0.9
Ik heb ook geprobeerd if NaN == NaN-instructie in een functie.
Ik heb ook dit artikel bekeken Hoe vervang ik NA waarden met nullen in een R-dataframe?terwijl je naar enkele andere artikelen kijkt.
Alle methoden die ik heb geprobeerd hebben niet gewerkt of herkennen NaN niet.
Alle tips of oplossingen worden op prijs gesteld.
Antwoord 1, autoriteit 100%
Ik geloof dat DataFrame.fillna()
dit voor je zal doen.
Link naar Documenten voor een dataframeen voor een serie.
Voorbeeld:
In [7]: df
Out[7]:
0 1
0 NaN NaN
1 -0.494375 0.570994
2 NaN NaN
3 1.876360 -0.229738
4 NaN NaN
In [8]: df.fillna(0)
Out[8]:
0 1
0 0.000000 0.000000
1 -0.494375 0.570994
2 0.000000 0.000000
3 1.876360 -0.229738
4 0.000000 0.000000
Als u de NaN’s in slechts één kolom wilt vullen, selecteert u alleen die kolom. in dit geval gebruik ik inplace=True om de inhoud van df daadwerkelijk te wijzigen.
In [12]: df[1].fillna(0, inplace=True)
Out[12]:
0 0.000000
1 0.570994
2 0.000000
3 -0.229738
4 0.000000
Name: 1
In [13]: df
Out[13]:
0 1
0 NaN 0.000000
1 -0.494375 0.570994
2 NaN 0.000000
3 1.876360 -0.229738
4 NaN 0.000000
BEWERKEN:
Gebruik de ingebouwde kolomspecifieke functionaliteit om een SettingWithCopyWarning
te vermijden:
df.fillna({1:0}, inplace=True)
Antwoord 2, autoriteit 17%
Het is niet gegarandeerd dat het snijden een weergave of een kopie oplevert. Je kunt doen
df['column'] = df['column'].fillna(value)
Antwoord 3, autoriteit 7%
Je zou replace
om NaN
te veranderen in 0
:
import pandas as pd
import numpy as np
# for column
df['column'] = df['column'].replace(np.nan, 0)
# for whole dataframe
df = df.replace(np.nan, 0)
# inplace
df.replace(np.nan, 0, inplace=True)
Antwoord 4, Autoriteit 3%
De onderstaande code werkte voor mij.
import pandas
df = pandas.read_csv('somefile.txt')
df = df.fillna(0)
Antwoord 5, Autoriteit 3%
Ik wilde gewoon een beetje een update / speciaal geval bieden, omdat het lijkt erop dat mensen nog steeds hier komen. Als u een multi-index gebruikt of anderszins een index-snijmachine gebruikt, is de inmlace = TRUE-optie mogelijk niet voldoende om de plak die u hebt gekozen bij te werken. Bijvoorbeeld in een multi-index van 2×2 niveau, zal dit geen waarden veranderen (vanaf Panda’s 0.15):
idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)
Het “probleem” is dat de chaining het vulvaardigheidsvermogen breekt om het originele dataframe bij te werken. Ik heb “probleem” in aanhalingstekens gezet omdat er goede redenen zijn voor de ontwerpbeslissingen die hebben geleid tot het niet interpreteren via deze ketens in bepaalde situaties. Ook is dit een complex voorbeeld (hoewel ik er echt in liep), maar hetzelfde kan van toepassing zijn op minder niveaus van indexen, afhankelijk van hoe u plak.
De oplossing is dataframe.Update:
df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))
Het is één regel, leest redelijk goed (soort) en elimineert onnodig rommelig met tussenliggende variabelen of lussen, terwijl u Filna kunt toepassen op een multi-level slice die u leuk vindt!
Als iemand plaatsen kan vinden, werkt dit niet alsjeblieft, post in de opmerkingen, ik heb ermee ingeschakeld en kijk naar de bron en het lijkt ten minste mijn multi-index-slice-problemen op te lossen.
Antwoord 6
Eenvoudige manier om de ontbrekende waarden te vullen:-
vullentekenreekskolommen:wanneer tekenreekskolommen ontbrekende waarden en NaN-waarden hebben.
df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)
vullennumerieke kolommen:wanneer de numerieke kolommen ontbrekende waarden en NaN-waarden hebben.
df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)
NaN met nul invullen:
df['column name'].fillna(0, inplace = True)
Antwoord 7
U kunt ook woordenboeken gebruiken om NaN-waarden van de specifieke kolommen in het DataFrame te vullen in plaats van om de hele DF te vullen met een of andere waarde.
import pandas as pd
df = pd.read_excel('example.xlsx')
df.fillna( {
'column1': 'Write your values here',
'column2': 'Write your values here',
'column3': 'Write your values here',
'column4': 'Write your values here',
.
.
.
'column-n': 'Write your values here'} , inplace=True)
Antwoord 8
Gezien de specifieke kolom Amount
in de bovenstaande tabel is van het type geheel getal. Het volgende zou een oplossing zijn:
df['Amount'] = df.Amount.fillna(0).astype(int)
Evenzo kunt u deze vullen met verschillende gegevenstypen zoals float
, str
enzovoort.
In het bijzonder zou ik datatype overwegen om verschillende waarden van dezelfde kolom te vergelijken.
Antwoord 9
Om NA-waarden in Panda’s
te vervangen
df['column_name'].fillna(value_to_be_replaced,inplace=True)
Indien inplace = False
, in plaats van de DF (dataframe) bij te werken, retourneert deze de gewijzigde waarden.
Antwoord 10
Om NAN in verschillende kolommen op verschillende manieren te vervangen:
replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
df.fillna(value=replacement)
Antwoord 11
Als je het naar een PandaS-dataframe zou converteren, kun je dit ook bereiken met behulp van fillna
.
import numpy as np
df=np.array([[1,2,3, np.nan]])
import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)
Hierdoor wordt het volgende teruggegeven:
0 1 2 3
0 1.0 2.0 3.0 NaN
>>> df.fillna(0)
0 1 2 3
0 1.0 2.0 3.0 0.0
Antwoord 12
Er zijn voornamelijk twee opties beschikbaar; In geval van imputatie of vulling van ontbrekende waarden NAN / NP.NAN met slechts numerieke vervangingen (over kolom (en):
df['Amount'].fillna(value=None, method= ,axis=1,)
is voldoende:
Vanaf de documentatie:
Waarde: Scalar, DICT, Series of Dataframe
Waarde om te gebruiken om gaten te vullen (b.v. 0), afwisselend a
DICT / SERIE / DATAFAME VAN VAARDEN DIE SPECIFIEKEN Welke waarde voor gebruik
elke index (voor een reeks) of kolom (voor een dataframe). (Waarden niet
In de DICT / Series / Dataframe wordt niet ingevuld). Deze waarde kan het niet
een lijst zijn.
Wat betekent ‘snaren’ of ‘constanten’ niet langer toegestaan om te worden toegerekend.
Gebruik voor meer gespecialiseerde imputaties Simpleimputer () :
from sklearn.impute import SimpleImputer
si = SimpleImputer(strategy='constant', missing_values=np.nan, fill_value='Replacement_Value')
df[['Col-1', 'Col-2']] = si.fit_transform(X=df[['C-1', 'C-2']])
Antwoord 13
Vervang alle nan met 0
df = df.fillna(0)
Antwoord 14
Als u NAN wilt invullen voor een specifieke kolom U kunt LOC gebruiken:
d1 = {"Col1" : ['A', 'B', 'C'],
"fruits": ['Avocado', 'Banana', 'NaN']}
d1= pd.DataFrame(d1)
output:
Col1 fruits
0 A Avocado
1 B Banana
2 C NaN
d1.loc[ d1.Col1=='C', 'fruits' ] = 'Carrot'
output:
Col1 fruits
0 A Avocado
1 B Banana
2 C Carrot
Antwoord 15
Dit werkt voor mij, maar niemand heeft het genoemd. zou er iets mis mee kunnen zijn?
df.loc[df['column_name'].isnull(), 'column_name'] = 0