Hoe vervang je NaN-waarden door nullen in een kolom van een Pandas-dataframe?

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 SettingWithCopyWarningte 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 replaceom NaNte 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 Amountin 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, strenzovoort.

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

Other episodes