如何统计pandas数据框中的列值
我有数据,其中我想查找NaN的数量,所以如果它小于某个阈值,我会放弃这个列。 我看了,但没有find任何function。 有count_values(),但对我来说会很慢,因为大多数值是不同的,我只需要计算NaN。
您可以使用isnull()
方法,然后求和来计算nan值。 对于一列:
In [1]: s = pd.Series([1,2,3, np.nan, np.nan]) In [4]: s.isnull().sum() Out[4]: 2
对于几列,它也起作用:
In [5]: df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]}) In [6]: df.isnull().sum() Out[6]: a 1 b 2 dtype: int64
你可以从非nan值的总数中减去总长度:
count_nan = len(df) - df.count()
你应该在你的数据上计时。 与isnull
解决scheme相比,小型系列的速度提高了3倍。
由于pandas0.14.1我的build议在这里有一个关键字参数在value_counts方法已经实现:
import pandas as pd df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]}) for col in df: print df[col].value_counts(dropna=False) 2 1 1 1 NaN 1 dtype: int64 NaN 2 1 1 dtype: int64
如果你正在使用Jupyter Notebook,那么……
%%timeit df.isnull().any().any()
要么
%timeit df.isnull().values.sum()
或者,数据中是否有NaN,如果有,在哪里?
df.isnull().any()
基于第二个也是最受投票的答案,我们可以很容易地定义一个函数,它给了我们一个数据框来预览缺失值和每列中缺失值的百分比:
def missing_values_table(df): mis_val = df.isnull().sum() mis_val_percent = 100 * df.isnull().sum()/len(df) mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1) mis_val_table_ren_columns = mis_val_table.rename( columns = {0 : 'Missing Values', 1 : '% of Total Values'}) return mis_val_table_ren_columns
如果它只是在一个pandas列这个数值是一个快速的方法
import pandas as pd ## df1 as an example data frame ## col1 name of column for which you want to calculate the nan values sum(pd.isnull(df1['col1']))
您可以使用value_counts方法并打印np.nan的值
s.value_counts(dropna = False)[np.nan]
在我的代码中使用了@sushmit提出的解决scheme。 colNullCnt = [] for z in range(len(df1.cols)): colNullCnt.append([df1.cols[z], sum(pd.isnull(trainPd[df1.cols[z]]))])
也可以是 – colNullCnt = [] for z in range(len(df1.cols)): colNullCnt.append([df1.cols[z], sum(pd.isnull(trainPd[df1.cols[z]]))])
这个优点是它返回df中每个列的结果。
基于给出的答案和一些改进,这是我的方法
def PercentageMissin(Dataset): """this function will return the percentage of missing values in a dataset """ if isinstance(Dataset,pd.DataFrame): adict={} #a dictionary conatin keys columns names and values percentage of missin value in the columns for col in Dataset.columns: adict[col]=(np.count_nonzero(Dataset[col].isnull())*100)/len(Dataset[col]) return pd.DataFrame(adict,index=['% of missing'],columns=adict.keys()) else: raise TypeError("can only be used with panda dataframe")