如何在Pandas DataFrame中同时获取多列的值计数?

Xin*_*Xin 40 python numpy pandas

如果Pandas DataFrame有多个具有分类值(0或1)的列,是否可以方便地同时获取每列的value_counts?

例如,假设我生成一个DataFrame,如下所示:

import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd'))
Run Code Online (Sandbox Code Playgroud)

我可以像这样得到一个DataFrame:

   a  b  c  d
0  0  1  1  0
1  1  1  1  1
2  1  1  1  0
3  0  1  0  0
4  0  0  0  1
5  0  1  1  0
6  0  1  1  1
7  1  0  1  0
8  1  0  1  1
9  0  1  1  0
Run Code Online (Sandbox Code Playgroud)

如何方便地获取每列的值计数并方便地获得以下内容?

   a  b  c  d
0  6  3  2  6
1  4  7  8  4
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是:

pieces = []
for col in df.columns:
    tmp_series = df[col].value_counts()
    tmp_series.name = col
    pieces.append(tmp_series)
df_value_counts = pd.concat(pieces, axis=1)
Run Code Online (Sandbox Code Playgroud)

但是必须有一种更简单的方法,比如堆叠,旋转或分组?

EdC*_*ica 69

只需致电apply并通过pd.Series.value_counts:

In [212]:
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd'))
df.apply(pd.Series.value_counts)
Out[212]:
   a  b  c  d
0  4  6  4  3
1  6  4  6  7
Run Code Online (Sandbox Code Playgroud)

  • 同样的问题,你如何添加“normalize=True”?--- 抱歉找到了解决方案: df.apply(pd.Series.value_counts, normalize=True) (3认同)

Ted*_*rou 20

其实是有一个相当有趣的,先进的与做这个问题的方式crosstabmelt

df = pd.DataFrame({'a': ['table', 'chair', 'chair', 'lamp', 'bed'],
                   'b': ['lamp', 'candle', 'chair', 'lamp', 'bed'],
                   'c': ['mirror', 'mirror', 'mirror', 'mirror', 'mirror']})

df

       a       b       c
0  table    lamp  mirror
1  chair  candle  mirror
2  chair   chair  mirror
3   lamp    lamp  mirror
4    bed     bed  mirror
Run Code Online (Sandbox Code Playgroud)

我们可以先融化DataFrame

df1 = df.melt()
df1

   columns   index
0        a   table
1        a   chair
2        a   chair
3        a    lamp
4        a     bed
5        b    lamp
6        b  candle
7        b   chair
8        b    lamp
9        b     bed
10       c  mirror
11       c  mirror
12       c  mirror
13       c  mirror
14       c  mirror
Run Code Online (Sandbox Code Playgroud)

然后使用交叉表函数计算每列的值.这会将数据类型保留为int,而当前选择的答案不是这种情况:

pd.crosstab(index=df['index'], columns=df['columns'])

columns  a  b  c
index           
bed      1  1  0
candle   0  1  0
chair    2  1  0
lamp     1  2  0
mirror   0  0  5
table    1  0  0
Run Code Online (Sandbox Code Playgroud)

或者在一行中,将列名称扩展为参数名称**(这是高级的)

pd.crosstab(**df.melt(var_name='columns', value_name='index'))
Run Code Online (Sandbox Code Playgroud)

此外,value_counts现在是一个顶级功能.因此,您可以简化当前选择的以下答案:

df.apply(pd.value_counts)
Run Code Online (Sandbox Code Playgroud)

  • 交叉表很好,因为它给你留下了整数,尽管我们也可以使用 df.apply(pd.value_counts).fillna(0).astype(int) 来获得它 (2认同)

mOn*_*Ona 16

要仅获取特定列的计数:

df[['a', 'b']].apply(pd.Series.value_counts)

其中 df 是数据框的名称,“a”和“b”是要计算值的列。


Ser*_*lov 8

选择所有分类列并同时创建包含所有值计数的数据框的解决方案:

df = pd.DataFrame({
'fruits': ['apple', 'mango', 'apple', 'mango', 'mango', 'pear', 'mango'],
'vegetables': ['cucumber', 'eggplant', 'tomato', 'tomato', 'tomato', 'tomato', 'pumpkin'],
'sauces': ['chili', 'chili', 'ketchup', 'ketchup', 'chili', '1000 islands', 'chili']})

cat_cols = df.select_dtypes(include=object).columns.tolist()
(pd.DataFrame(
    df[cat_cols]
    .melt(var_name='column', value_name='value')
    .value_counts())
.rename(columns={0: 'counts'})
.sort_values(by=['column', 'counts']))

                            counts
column      value   
fruits      pear            1
            apple           2
            mango           4
sauces      1000 islands    1
            ketchup         2
            chili           4
vegetables  pumpkin         1
            eggplant        1
            cucumber        1
            tomato          4
            
Run Code Online (Sandbox Code Playgroud)


小智 7

您还可以尝试以下代码:

for i in heart.columns:
    x = heart[i].value_counts()
    print("Column name is:",i,"and it value is:",x)
Run Code Online (Sandbox Code Playgroud)