如何在“pandas”中按列获取缺失/ NaN数据的摘要计数?

时间:2014-03-07 18:08:09

标签: r pandas reporting nan missing-data

R 中,我可以使用summary命令快速查看缺失数据的计数,但是等效的pandas DataFrame方法,describe不报告这些值。

我认为我可以做点什么

len(mydata.index) - mydata.count()

计算每列的缺失值的数量,但我想知道是否有更好的习语(或者我的方法是否正确)。

6 个答案:

答案 0 :(得分:34)

describeinfo都会报告非缺失值的计数。

In [1]: df = DataFrame(np.random.randn(10,2))

In [2]: df.iloc[3:6,0] = np.nan

In [3]: df
Out[3]: 
          0         1
0 -0.560342  1.862640
1 -1.237742  0.596384
2  0.603539 -1.561594
3       NaN  3.018954
4       NaN -0.046759
5       NaN  0.480158
6  0.113200 -0.911159
7  0.990895  0.612990
8  0.668534 -0.701769
9 -0.607247 -0.489427

[10 rows x 2 columns]

In [4]: df.describe()
Out[4]: 
              0          1
count  7.000000  10.000000
mean  -0.004166   0.286042
std    0.818586   1.363422
min   -1.237742  -1.561594
25%   -0.583795  -0.648684
50%    0.113200   0.216699
75%    0.636036   0.608839
max    0.990895   3.018954

[8 rows x 2 columns]


In [5]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 2 columns):
0    7 non-null float64
1    10 non-null float64
dtypes: float64(2)

为了得到失踪的数量,你的溶液是正确的

In [20]: len(df.index)-df.count()
Out[20]: 
0    3
1    0
dtype: int64

你也可以这样做

In [23]: df.isnull().sum()
Out[23]: 
0    3
1    0
dtype: int64

答案 1 :(得分:6)

作为一个微小的补充,为了让DataFrame列失去百分比,将@Jeff和@ userS的答案结合起来可以获得:

df.isnull().sum()/len(df)*100

答案 2 :(得分:3)

这不是一个完整的摘要,但它可以让您快速了解列级数据

def getPctMissing(series):
    num = series.isnull().sum()
    den = series.count()
    return 100*(num/den)

答案 3 :(得分:1)

如果您想查看每列的非空摘要,只需使用df.info(null_counts=True)

示例 1:

df = pd.DataFrame(np.random.randn(10,5), columns=list('abcde'))
df.iloc[:4,0] = np.nan
df.iloc[:3,1] = np.nan
df.iloc[:2,2] = np.nan
df.iloc[:1,3] = np.nan

df.info(null_counts=True)

输出:


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   a       6 non-null      float64
 1   b       7 non-null      float64
 2   c       8 non-null      float64
 3   d       9 non-null      float64
 4   e       10 non-null     float64
dtypes: float64(5)
memory usage: 528.0 bytes

另外,如果你想自定义结果,比如添加 nan_rate ,我写了一个方法


def describe_nan(df):
    return pd.DataFrame([(i, df[df[i].isna()].shape[0],df[df[i].isna()].shape[0]/df.shape[0]) for i in df.columns], columns=['column', 'nan_counts', 'nan_rate'])

describe_nan(df)

>>> column  nan_counts  nan_rate
0   a   4   0.4
1   b   3   0.3
2   c   2   0.2
3   d   1   0.1
4   e   0   0.0

答案 4 :(得分:0)

我还不能发表评论,但要补充杰夫的答案,但是 如果你不关心哪些专栏有Nan的,你只想整体检查一下 只需添加第二个.sum()即可获得单个值。

result = df.isnull().sum().sum()
result > 0

一个系列只需要一个.sum()而一个Panel()需要三个

答案 5 :(得分:0)

以下一项将解决问题,并将为每一列返回空计数:

df.isnull().sum(axis=0)

df.isnull()返回具有True / False值的数据帧
sum(axis=0)将一列所有行中的值相加