it-swarm.com.de

Wie kann ich alle NaN-Werte durch Nullen in einer Spalte eines pandas-Datenrahmens ersetzen?

Ich habe einen Datenrahmen wie unten

      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

wenn ich versuche, eine Funktion auf die Spalte "Betrag" anzuwenden, wird die folgende Fehlermeldung angezeigt.

ValueError: cannot convert float NaN to integer

Ich habe versucht, eine Funktion mit .isnan aus dem Mathematikmodul anzuwenden. Ich habe das Attribut pandas .replace ausprobiert. Ich habe das Attribut .sparse data aus pandas 0.9 ausprobiert. Ich habe es auch versucht, wenn NaN = = NaN-Anweisung in einer Funktion. Ich habe mir auch diesen Artikel angesehen Wie ersetze ich NA-Werte durch Nullen in einem R-Datenrahmen? während ich mir einige andere Artikel ansah. Alle Methoden, die ich ausprobiert habe, haben nicht funktioniert oder erkennen NaN nicht. Irgendwelche Hinweise oder Lösungen wäre dankbar.

372
George Thompson

Ich glaube, dass DataFrame.fillna() dies für Sie tun wird.

Verknüpfung zu Dokumenten für einen Datenrahmen und für eine Reihe .

Beispiel:

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

Um die NaNs nur in eine Spalte einzufügen, wählen Sie nur diese Spalte aus. In diesem Fall verwende ich inplace = True, um den Inhalt von df tatsächlich zu ändern.

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
625
Aman

Es kann nicht garantiert werden, dass das Slicing eine Ansicht oder eine Kopie zurückgibt. Du kannst tun

df['column'] = df['column'].fillna(value)
95
rakesh

Sie können replace verwenden, um NaN in 0 zu ändern:

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)
23

Ich wollte nur ein kleines Update/einen speziellen Fall bereitstellen, da es so aussieht, als ob die Leute immer noch hierher kommen. Wenn Sie einen Multi-Index oder einen anderen Index-Slicer verwenden, reicht die Option inplace = True möglicherweise nicht aus, um das ausgewählte Segment zu aktualisieren. Zum Beispiel ändert dies in einem 2x2-Level-Multi-Index keine Werte (ab pandas 0.15):

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

Das "Problem" besteht darin, dass die Verkettung die Fillna-Fähigkeit zum Aktualisieren des ursprünglichen Datenrahmens unterbricht. Ich habe "Problem" in Anführungszeichen gesetzt, weil es gute Gründe für die Entwurfsentscheidungen gibt, die dazu geführt haben, dass diese Ketten in bestimmten Situationen nicht interpretiert wurden. Dies ist auch ein komplexes Beispiel (obwohl ich es wirklich kennengelernt habe), aber dasselbe gilt möglicherweise für weniger Indexebenen, je nachdem, wie Sie Slices erstellen.

Die Lösung ist DataFrame.update:

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

Es ist eine Zeile, liest sich einigermaßen gut (irgendwie) und beseitigt unnötiges Durcheinander mit Zwischenvariablen oder Schleifen, während Sie Fillna auf jedes beliebige Slice mit mehreren Ebenen anwenden können!

Wenn jemand Orte findet, an denen dies nicht funktioniert, posten Sie dies bitte in den Kommentaren. Ich habe damit herumgespielt und mir die Quelle angesehen, und es scheint zumindest meine Multi-Index-Slice-Probleme zu lösen.

21

Der folgende Code hat bei mir funktioniert.

import pandas

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

df = df.fillna(0)
20
Cornel Ciobanu

Einfaches Ausfüllen der fehlenden Werte: -

FüllungZeichenkettenspalten: wenn Zeichenkettenspalten fehlende Werte und NaN-Werte haben.

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

Füllungnumerische Spalten: wenn die numerischen Spalten fehlende Werte und NaN-Werte haben.

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

NaN mit Null füllen:

df['column name'].fillna(0, inplace = True)
4
tulsi kumar

enter image description here

Unter Berücksichtigung der speziellen Spalte Amount in der obigen Tabelle handelt es sich um einen Integer-Typ. Folgendes wäre eine Lösung:

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

Ebenso können Sie ihn mit verschiedenen Datentypen wie float, str usw. füllen.

Insbesondere würde ich den Datentyp in Betracht ziehen, um verschiedene Werte derselben Spalte zu vergleichen.

1
Bharath_Raja

Na-Werte in Pandas ersetzen

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

wenn inplace = False, werden die geänderten Werte zurückgegeben, anstatt den df (Datenrahmen) zu aktualisieren.

1
Vivek Ananthan

Wenn Sie es in einen pandas Datenrahmen konvertieren, können Sie dies auch mit fillna erreichen.

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

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

Dies gibt Folgendes zurück:

     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
Michael Grogan

In erster Linie stehen zwei Optionen zur Verfügung. bei Anrechnung oder Ausfüllen fehlender Werte NaN/np.nan mit nur numerischen Ersetzungen (spaltenübergreifend):

df['Amount'].fillna(value=None, method= ,axis=1,) ist ausreichend:

Aus der Dokumentation:

value: scalar, dict, Series oder DataFrame Wert, der zum Füllen von Löchern verwendet werden soll (z. B. 0), alternativ ein dict/Series/DataFrame mit Werten, die angeben, welcher Wert für jeden Index (für eine Serie) oder Spalte (für einen DataFrame) verwendet werden soll . (Werte, die nicht in dict/Series/DataFrame enthalten sind, werden nicht gefüllt). Dieser Wert kann keine Liste sein.

Was bedeutet, dass "Strings" oder "Konstanten" nicht mehr unterstellt werden dürfen.

Für spezialisiertere Imputationen verwenden Sie 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']])

0
Sumanth Lazarus

Sie können auch Wörterbücher verwenden, um die NaN-Werte der bestimmten Spalten im DataFrame zu füllen, anstatt alle DF mit einem einzigen Wert zu füllen.

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)
0
Farrukh Faizy