pandas DataFrame?のnan値(数ではない)を考慮する最良の方法は何ですか?
次のコード:
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())
出力:
nan: 0
1: 1
3: 3
total: 4
望ましい出力は次のとおりです。
nan: 2
1: 1
3: 3
total: 6
私はpandas 0.17 with Python 3.5.0 with Anaconda 2.4.0。
DataFrame df
の列_'a'
_のNaN値のみをカウントする場合は、次を使用します。
_len(df) - df['a'].count()
_
ここでcount()
はNaN以外の値の数を示し、これは値の総数から差し引かれます(len(df)
で与えられます)。
everydf
の列のNaN値をカウントするには、次を使用します。
_len(df) - df.count()
_
_value_counts
_を使用する場合は、notに_dropna=False
_( .14.1 で追加)を設定してNaN値をドロップするよう指示します。
_dfv = dfd['a'].value_counts(dropna=False)
_
これにより、列の欠損値もカウントできます。
_ 3 3
NaN 2
1 1
Name: a, dtype: int64
_
コードの残りの部分は期待どおりに動作するはずです(sum
を呼び出す必要はないことに注意してください; print("nan: %d" % dfv[np.nan])
で十分です)。
Null値のみをカウントするには、 isnull()
を使用できます。
In [11]:
dfd.isnull().sum()
Out[11]:
a 2
dtype: int64
ここで、a
は列名であり、列にNULL値が2回出現しています。
データフレームのすべての列にあるすべてのNaNをカウントするきれいな方法は...
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())
単一の合計を使用して、各列のNaNのカウントを取得します。 2番目の合計は、それらの列の合計を合計します。
all dfのnansをカウントするさらに別の方法:
num_nans = df.size - df.count().sum()
タイミング:
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()')
プリント:
3.998805362999999
3.7503365439999996
3.689461442999999
ほぼ同等
次のコードを使用して各列のnull値の概要のみが必要な場合df.isnull().sum()
次のコードを使用してデータフレーム内のnull値の数を知りたい場合df.isnull().sum().sum() # calculate total