Was ist der beste Weg, um Nan-Werte in einem Pandas-DataFrame (keine Anzahl) zu berücksichtigen?
Der folgende Code:
import numpy as np
import pandas as pd
dfd = pd.DataFrame([1, np.nan, 3, 3, 3, np.nan], columns=['a'])
dfv = dfd.a.value_counts().sort_index()
print("nan: %d" % dfv[np.nan].sum())
print("1: %d" % dfv[1].sum())
print("3: %d" % dfv[3].sum())
print("total: %d" % dfv[:].sum())
Ausgänge:
nan: 0
1: 1
3: 3
total: 4
Während die gewünschte Ausgabe ist:
nan: 2
1: 1
3: 3
total: 6
Ich verwende Pandas 0.17 mit Python 3.5.0 mit Anaconda 2.4.0.
Wenn Sie nur NaN-Werte in der Spalte 'a'
eines DataFrame df
zählen möchten, verwenden Sie:
len(df) - df['a'].count()
Hier gibt count()
die Anzahl der Nicht-NaN-Werte an, und diese wird von der Gesamtzahl der Werte (angegeben durch len(df)
) abgezogen.
Um die NaN-Werte in der every -Spalte von df
zu zählen, verwenden Sie:
len(df) - df.count()
Wenn Sie value_counts
verwenden möchten, teilen Sie es not mit, um NaN-Werte zu löschen, indem Sie dropna=False
(hinzugefügt in 0.14.1 ) einstellen:
dfv = dfd['a'].value_counts(dropna=False)
Dadurch können auch die fehlenden Werte in der Spalte gezählt werden:
3 3
NaN 2
1 1
Name: a, dtype: int64
Der Rest Ihres Codes sollte dann wie erwartet funktionieren (beachten Sie, dass es nicht notwendig ist, sum
aufzurufen; es genügt nur print("nan: %d" % dfv[np.nan])
.).
Um nur Nullwerte zu zählen, können Sie isnull()
verwenden:
In [11]:
dfd.isnull().sum()
Out[11]:
a 2
dtype: int64
Hier ist a
der Spaltenname und es gibt zwei Vorkommen des Nullwerts in der Spalte.
Eine gute Möglichkeit, alle NaNs in allen Spalten Ihres Datenrahmens zu zählen, wäre ...
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
print(df.isna().sum().sum())
Mit einer einzelnen Summe erhalten Sie die Anzahl der NaNs für jede Spalte. Die zweite Summe summiert diese Spaltensummen.
Noch eine andere Möglichkeit, alle die Nans in einem df zu zählen:
num_nans = df.size - df.count().sum()
Timings:
import timeit
import numpy as np
import pandas as pd
df_scale = 100000
df = pd.DataFrame(
[[1, np.nan, 100, 63], [2, np.nan, 101, 63], [2, 12, 102, 63],
[2, 14, 102, 63], [2, 14, 102, 64], [1, np.nan, 200, 63]] * df_scale,
columns=['group', 'value', 'value2', 'dummy'])
repeat = 3
numbers = 100
setup = """import pandas as pd
from __main__ import df
"""
def timer(statement, _setup=None):
print (min(
timeit.Timer(statement, setup=_setup or setup).repeat(
repeat, numbers)))
timer('df.size - df.count().sum()')
timer('df.isna().sum().sum()')
timer('df.isnull().sum().sum()')
druckt:
3.998805362999999
3.7503365439999996
3.689461442999999
so ziemlich gleichwertig
wenn Sie nur die Zusammenfassung des Nullwerts für jede Spalte wünschen, verwenden Sie den folgenden Code df.isnull().sum()
, wenn Sie wissen möchten, wie viele Nullwerte im Datenrahmen mit dem folgenden Code df.isnull().sum().sum() # calculate total
vorhanden sind.