什么时候适合使用df.value_counts()vs df.groupby('...').count()?

Oll*_*ani 15 python dataframe pandas pandas-groupby

我听说熊猫经常有多种方法可以做同样的事情,但我想知道 -

如果我尝试按特定列中的值对数据进行分组并计算具有该值的项目数,则何时使用df.groupby('colA').count()以及何时使用有意义df['colA'].value_counts()

Flo*_*oor 17

Groupby并且value_counts是完全不同的功能.您无法在数据框上执行value_counts.

Value Counts 仅限于单个列或系列,其唯一目的是返回值的一系列频率

Groupby返回一个对象,以便可以对其执行统计计算.因此,当您执行df.groupby(col).count()此操作时,将返回与specific columnsgroupby相关的列中存在的真值的数量.

应该value_counts何时使用以及应该何时 groupby.count使用:让我们举个例子

df = pd.DataFrame({'id': [1, 2, 3, 4, 2, 2, 4], 'color': ["r","r","b","b","g","g","r"], 'size': [1,2,1,2,1,3,4]})
Run Code Online (Sandbox Code Playgroud)

分组数:

df.groupby('color').count()
       id  size
color          
b       2     2
g       2     2
r       3     3
Run Code Online (Sandbox Code Playgroud)

Groupby计数通常用于获取所有列with reference towith respect to 指定的一个或多个列中存在的有效值数.所以不会排除数字(nan).

要使用groupby查找频率,您需要像@jez那样聚合指定的列本身.(也许是为了避免这种情况并使开发人员生活变得轻松实现value_counts).

价值计数:

df['color'].value_counts()

r    3
g    2
b    2
Name: color, dtype: int64
Run Code Online (Sandbox Code Playgroud)

值计数通常用于查找一个特定列中存在的值的频率.

结论 :

.groupby(col).count()当您想要查找相对于指定列的列中存在的有效值的频率时,应使用此值col.

.value_counts() 应该用来查找一系列的频率.


jez*_*ael 15

有差异value_counts回报:

生成的对象将按降序排列,以便第一个元素是最常出现的元素.

count不是,它按输出排序index(由列创建groupby('col')).


df.groupby('colA').count() 
Run Code Online (Sandbox Code Playgroud)

用于聚合dfby函数的所有列count.所以它计算除NaNs 之外的值.

因此,如果count只需要一列需要:

df.groupby('colA')['colA'].count() 
Run Code Online (Sandbox Code Playgroud)

样品:

df = pd.DataFrame({'colB':list('abcdefg'),
                   'colC':[1,3,5,7,np.nan,np.nan,4],
                   'colD':[np.nan,3,6,9,2,4,np.nan],
                   'colA':['c','c','b','a',np.nan,'b','b']})

print (df)
  colA colB  colC  colD
0    c    a   1.0   NaN
1    c    b   3.0   3.0
2    b    c   5.0   6.0
3    a    d   7.0   9.0
4  NaN    e   NaN   2.0
5    b    f   NaN   4.0
6    b    g   4.0   NaN

print (df['colA'].value_counts())
b    3
c    2
a    1
Name: colA, dtype: int64

print (df.groupby('colA').count())
      colB  colC  colD
colA                  
a        1     1     1
b        3     2     2
c        2     2     1

print (df.groupby('colA')['colA'].count())
colA
a    1
b    3
c    2
Name: colA, dtype: int64
Run Code Online (Sandbox Code Playgroud)