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.
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)
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)
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)
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.
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)
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)
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)
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
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.
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.
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)
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
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']])
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
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