Pandas DataFrame.value_counts() does not allow dropna=False



PandasSeries.value_counts()有一个dropna参数,但DataFrame.value_counts()没有。这是我的问题。但我确信这是有原因的,也有另一种解决方案

用例是我想在DataFrame中计算模式(特定列的值组合(。对于这个用例,我也想计算None/NaN

这是包含8行的数据。

name  foo  bar    sun
0   Tim    1    2   True
1   Tim    2    2  False
2   Tim    2    2  False
3  Anna    1    3   None
4  Anna    3    5   None
5   Bob    2    2  False
6   Bob    5    5   True
7   Bob    1    1   None

我可以用df[['foo', 'bar']].value_counts()计算所有的foo-bar组合,并得到sum 8(所有行(。

foo  bar
2    2      3
1    1      1
2      1
3      1
3    5      1
5    5      1
dtype: int64

但是,当我将包含NaN值的列添加到模式时,不计算具有NaN的行。

foo  bar  sun  
2    2    False    3
1    2    True     1
5    5    True     1

这是完整的代码。

import pandas as pd
import random as rd
data = {'name': ['Tim', 'Tim', 'Tim', 'Anna', 'Anna', 'Bob', 'Bob', 'Bob'],
'foo': [1, 2, 2, 1, 3, 2, 5, 1],
'bar': [2, 2, 2, 3, 5, 2, 5, 1],
'sun': [True, False, False, None, None, False, True, None]
}
# That is the initial DataFrame
df = pd.DataFrame(data)
print(df)
# counter foo-bar patterns
pa = df[['foo', 'bar']].value_counts()
print(pa)
# count foo-bar-sun patterns
# PROBLE: None/NaN is not counted
pb = df[['foo', 'bar', 'sun']].value_counts()
print(pb)

我认为它还不受支持,可能的替代解决方案:

pb = df.groupby(['foo', 'bar', 'sun'], dropna=False).size()
print(pb)
foo  bar  sun  
1    1    NaN      1
2    True     1
3    NaN      1
2    2    False    3
3    5    NaN      1
5    5    True     1
dtype: int64

相关内容

最新更新