2016-08-15 259 views
1

我在大型数据框上使用熊猫0.18.1。我对value_counts()的行为感到困惑。这是我的代码:为什么value_counts不显示所有值?

print df.phase.value_counts() 
def normalise_phase(x): 
    print x 
    return int(str(x).split('/')[0]) 
df['phase_normalised'] = df['phase'].apply(normalise_phase) 

此打印如下:

2  35092 
3  26248 
1  24646 
4  22189 
1/2  8295 
2/3  4219 
0  1829 
dtype: int64 
1 
nan 

两个问题:

  • 为什么nan印刷为一体的normalise_phase输出,当nan 没有被列为value_counts的值?
  • 为什么value_counts显示dtype作为int64如果有字符串值就像它 1/2nan吗?

回答

3

您需要通过dropna=False才能计算NaN(请参阅docs)。 int64是系列的dtype(值的计数)。这些值本身就是索引。如果您检查,索引的dtype将是对象。

ser = pd.Series([1, '1/2', '1/2', 3, np.nan, 5]) 

ser.value_counts(dropna=False) 
Out: 
1/2 2 
5  1 
3  1 
1  1 
NaN 1 
dtype: int64 

ser.value_counts(dropna=False).index 
Out: Index(['1/2', 5, 3, 1, nan], dtype='object') 
+0

谢谢!我不知道'value_counts'减少了'NaN'值,这感觉很不直观。 – Richard

+0

@Richard在基本操作中,熊猫的默认行为是忽略NaN(例如,当取得和时,numpy在这种情况下返回nan)。我想在value_counts NaNs被放弃是一致的,但我同意,当我第一次意识到这一点时,我很惊讶。 – ayhan