Jak zastąpić wartości NaN przez zera w kolumnie ramki danych Pandy?

Mam ramkę danych Pandy jak poniżej:

      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

Kiedy próbuję zastosować funkcję do kolumny Amount, pojawia się następujący błąd:

ValueError: cannot convert float NaN to integer

Próbowałem zastosować funkcję używając .isnan z modułu matematycznego Próbowałem pand .zamień atrybut Próbowałem .sparse data atrybut from pandas 0.9 Próbowałem również if nan = = nan w funkcji. Zajrzałem również do tego artykułu Jak zastąpić wartości NA zerami w ramce danych R? przeglądając Inne artykuły. Wszystkie metody, które wypróbowałem, nie zadziałały lub nie rozpoznały NaN. Wszelkie wskazówki lub rozwiązania będą mile widziane.

Author: ivanleoncz, 2012-11-08

13 answers

Wierzę, że zrobię to dla Ciebie.

Link do Docs dla a dataframe i dla A Series .

Przykład:

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

Aby wypełnić Nan tylko w jednej kolumnie, wybierz tylko tę kolumnę. w tym przypadku używam inplace = True, aby zmienić zawartość df.

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

EDIT:

Aby uniknąć SettingWithCopyWarning, użyj wbudowanej funkcji specyficznej dla kolumn:

df.fillna({1:0}, inplace=True)
 841
Author: Aman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-06 01:08:04

Nie jest gwarantowane, że krojenie zwróci widok lub kopię. You can do

df['column'] = df['column'].fillna(value)
 141
Author: rakesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-07 19:25:30

You could use replace aby zmienić NaN na 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)
 56
Author: Anton Protopopov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 05:11:20

Chciałem tylko dostarczyć trochę aktualizacji / specjalnego przypadku, ponieważ wygląda na to, że ludzie nadal tu przychodzą. Jeśli używasz wielu indeksów lub w inny sposób używasz krajalnicy indeksów, opcja inplace=True może nie wystarczyć, aby zaktualizować wybrany kawałek. Na przykład w multi-indeksie 2x2 nie zmieni to żadnych wartości (od 0.15):

idx = pd.IndexSlice
df.loc[idx[:,mask_1],idx[mask_2,:]].fillna(value=0,inplace=True)

"problem" polega na tym, że łączenie przerywa możliwość aktualizacji fillna oryginalnej ramki danych. Wstawiam" problem " w cudzysłowie, bo są dobre powody dla decyzji projektowych, które doprowadziły do nie interpretacji za pomocą tych łańcuchów w pewnych sytuacjach. Jest to również złożony przykład (choć naprawdę na niego wpadłem), ale to samo może dotyczyć mniejszej liczby indeksów w zależności od tego, jak pokroisz.

Rozwiązaniem jest DataFrame.update:

df.update(df.loc[idx[:,mask_1],idx[[mask_2],:]].fillna(value=0))

Jest to jedna linia, czyta się w miarę dobrze (w pewnym sensie) i eliminuje niepotrzebny bałagan ze zmiennymi pośrednimi lub pętlami, pozwalając jednocześnie na zastosowanie fillna do dowolnego wielopoziomowego plasterka lubisz!

Jeśli ktoś może znaleźć miejsca to nie działa proszę pisać w komentarzach, grzebałem w tym i patrzyłem na źródło i wydaje mi się, że rozwiązuje przynajmniej moje problemy z Multi-index slice.

 25
Author: Ezekiel Kruglick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 18:29:03

Poniższy kod zadziałał dla mnie.

import pandas

df = pandas.read_csv('somefile.txt')

df = df.fillna(0)
 25
Author: Cornel Ciobanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 21:13:37

Łatwy sposób wypełnienia brakujących wartości:-

Napełnianie kolumny łańcuchowe: gdy kolumny łańcuchowe mają brakujące wartości i wartości NaN.

df['string column name'].fillna(df['string column name'].mode().values[0], inplace = True)

Napełnianie kolumny numeryczne: gdy kolumny numeryczne mają brakujące wartości i wartości NaN.

df['numeric column name'].fillna(df['numeric column name'].mean(), inplace = True)

Wypełnienie NaN przez zero:

df['column name'].fillna(0, inplace = True)
 8
Author: tulsi kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-07 19:03:15

Możesz również użyć słowników do wypełnienia wartości NaN określonych kolumn w ramce danych, zamiast wypełniać wszystkie DF jakimś onevalue.

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)
 6
Author: Farrukh Faizy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-16 20:02:37

Tutaj wpisz opis obrazka

Biorąc pod uwagę konkretną kolumnę Amount w powyższej tabeli jest typu integer. Rozwiązaniem byłoby:

df['Amount'] = df.Amount.fillna(0).astype(int)

Podobnie, możesz wypełnić go różnymi typami danych, takimi jak float, str i tak dalej.

W szczególności, rozważyłbym datatype do porównania różnych wartości tej samej kolumny.

 4
Author: Bharath_Raja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-26 11:41:48

Aby zastąpić wartości na w pandach

df['column_name'].fillna(value_to_be_replaced,inplace=True)

If inplace = False, zamiast aktualizować DF (dataframe) zwróci zmodyfikowane wartości.

 3
Author: Vivek Ananthan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-29 19:46:45

Aby zastąpić nan w różnych kolumnach różnymi sposobami:

   replacement= {'column_A': 0, 'column_B': -999, 'column_C': -99999}
   df.fillna(value=replacement)
 2
Author: Alla Abdella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-24 23:38:37

Jeśli miałbyś przekonwertować go na ramkę danych pandy, możesz to również osiągnąć za pomocą fillna.

import numpy as np
df=np.array([[1,2,3, np.nan]])

import pandas as pd
df=pd.DataFrame(df)
df.fillna(0)

Zwróci to:

     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
 1
Author: Michael Grogan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-15 18:20:57

Dostępne są przede wszystkim dwie opcje; w przypadku przypisania lub wypełnienia brakujących wartości NaN / np.nan tylko z numerycznymi zamiennikami(w poprzek kolumny (kolumn):

df['Amount'].fillna(value=None, method= ,axis=1,) jest wystarczające:

Z Dokumentacji:

Wartość: scalar, dict, Series, lub DataFrame Wartość do wypełnienia otworów (np. 0), na przemian a dict / Series / DataFrame wartości określających, której wartości użyć dla każdy indeks (dla serii) lub kolumna (dla ramki danych). (wartości nie w dict / Series / DataFrame nie będą wypełnione). Wartość ta nie może bądź listą.

Co oznacza, że "ciągi" lub "stałe" nie są już dopuszczalne do przypisania.

Dla bardziej wyspecjalizowanych przypisów użyj 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']])

 1
Author: Sumanth Lazarus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-23 13:36:14

Jeśli chcesz wypełnić NaN dla konkretnej kolumny możesz użyć loc:

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
 0
Author: AlexGo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-07 19:03:05