代码之家  ›  专栏  ›  技术社区  ›  Saeed

panda的value_counts()方法对缺失值的计数不一致

  •  1
  • Saeed  · 技术社区  · 8 月前

    请考虑这个简单的数据帧:

    df = pd.DataFrame({'x': [1, 2, 3, 4, 10]}, index = range(5))
    
    df:
        x
    0   1
    1   2
    2   3
    3   4
    4   10
    

    一些指标:

    ff_idx = [1, 2]
    
    sd_idx= [3, 4]
    

    通过基于上述索引过滤df来创建新列的一种方法:

    df['ff_sd_indicator'] = np.nan
    df['ff_sd_indicator'][df.index.isin(ff_idx)] = 'ff_count' 
    df['ff_sd_indicator'][df.index.isin(sd_idx)] = 'sd_count' 
    

    做同样事情的另一种方式:

    df['ff_sd_indicator2'] = np.select([df.index.isin(ff_idx) , df.index.isin(sd_idx)], ['ff_count','sd_count' ], default=np.nan)
    

    请注意,虽然 ff_sd_indicator ff_sd_indicator2 缺失值的打印方式不同(NaN vs NaN):

    df: 
    
        x   ff_sd_indicator ff_sd_indicator2
    0   1   NaN         nan
    1   2   ff_count    ff_count
    2   3   ff_count    ff_count
    3   4   sd_count    sd_count
    4   10  sd_count    sd_count
    

    我不在乎不同的打印,但令人惊讶的是,缺少的值没有出现在以下输出中:

    df['ff_sd_indicator'].value_counts()
    

    即:

    ff_sd_indicator
    ff_count    2
    sd_count    2
    

    但它们确实出现在以下输出中:

    df['ff_sd_indicator2'].value_counts()
    

    即:

    ff_sd_indicator2
    ff_count    2
    sd_count    2
    nan         1
    

    那么,value_counts()不计算中缺失的值是怎么回事呢 ff_sd_指示器 虽然它们是由与中缺少的值相同的np.nan创建的 ff_sd_指示器2 创建?

    编辑 df.info() :

    RangeIndex: 5 entries, 0 to 4
    Data columns (total 3 columns):
     #   Column            Non-Null Count  Dtype 
    ---  ------            --------------  ----- 
     0   x                 5 non-null      int64 
     1   ff_sd_indicator   5 non-null      object
     2   ff_sd_indicator2  5 non-null      object
    
    1 回复  |  直到 8 月前
        1
  •  0
  •   mozway    8 月前

    默认情况下 value_counts 降低NaN,这可以通过设置来避免 dropna=False :

    df['ff_sd_indicator'].value_counts(dropna=False)
    
    ff_sd_indicator
    ff_count    2
    sd_count    2
    NaN         1
    Name: count, dtype: int64
    

    如果您检查以下输出:

    np.select([df.index.isin(ff_idx) , df.index.isin(sd_idx)],
              ['ff_count','sd_count'], default=np.nan)
    

    然而,你会看到你没有NaN,而是一个字符串:

    array(['nan', 'ff_count', 'ff_count', 'sd_count', 'sd_count'],
          dtype='<U32')
    

    因此,该值为 自动下降。