每列使用pandas的value_counts函数

27

我有一个来自外部源(CSV文件)的数据帧,其中有许多列(约30个),但其中几列没有值或始终相同。 因此,我想快速查看每个列的value_counts,我该怎么做?

例如

  Id, temp, name
1 34, null, mark
2 22, null, mark
3 34, null, mark

将返回一个对象,其状态如下:

  • Id: 34 -> 2, 22 -> 1
  • temp: null -> 3
  • name: mark -> 3

这样我就知道temp无关紧要,而且name不重要(始终相同)。


循环遍历列并为每个列打印value_counts - joris
就像@joris所说的那样。有一个问题,要向DataFrame添加一个value_counts方法,但是与索引对齐有一些问题。 - TomAugspurger
6个回答

29

对于数据框:

df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

以下是代码

for c in df.columns:
    print "---- %s ---" % c
    print df[c].value_counts()

将会产生以下结果:

---- id ---
34    2
22    1
dtype: int64
---- temp ---
null    3
dtype: int64
---- name ---
mark    3
dtype: int64

感谢您的评论和回答。我以为可以不用循环来做到这一点,但似乎不行。(是的,我已经看到了提到的问题,希望很快就能解决 :))。 - Edouard
1
其实,为什么不用类似这样的映射: map(lambda x : x.value_counts(), mdf.columns) - Edouard
1
@Edouard,我认为你上一条评论中的代码应该是map(lambda x : mdf[x].value_counts(), mdf.columns) - alancalvitti
to_frame() and display() functions would be useful for an enhanced output , eg: for c in df.columns: display(df[c].value_counts().to_frame()) - Ikbel

12
您可以使用df.apply,它将使用提供的函数应用于每一列,在本例中是计算缺失值。这就是它的样子: df.apply(lambda x: x.isnull().value_counts())

这将创建一个包含所有三列的系列。如何拆分这些列并创建一个包含3列的数据框? - Xtiaan

10
一种优雅的方法,可以返回格式漂亮的序列,即将 pandas.Series.value_countspandas.DataFrame.stack 结合起来使用。
对于 DataFrame:
df = pandas.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=['id', 'temp', 'name'], index=[1, 2, 3]) 

您可以尝试如下操作:
df.apply(lambda x: x.value_counts()).T.stack()

在这段代码中,df.apply(lambda x: x.value_counts()) 对每一列应用 value_counts 并将其附加到生成的 DataFrame 中,因此您会得到一个具有相同列和每个列中每个不同值的一行(对于在每个列中没有出现的每个值的每个值都是null)的DataFrame

之后,T 转置了 DataFrame(因此您得到了一个索引等于列且列等于可能值的DataFrame),stackDataFrame 的列转换为 MultiIndex 的新级别,并 "删除" 所有 null 值,使整个内容变成了一个 Series

这样做的结果是

id    22      1
      34      2
temp  null    3
name  mark    3
dtype: float64

6
以下是类似的代码:
df = pd.DataFrame(data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']], columns=["id", 'temp', 'name'], index=[1, 2, 3]) 
result2 = df.apply(pd.value_counts)
result2

将会产生:

在此输入图片描述


1

这与@Jagie的回复类似,但另外还要:

  1. 在列中缺失值处填零
  2. 将计数转换为整数
    df = pd.DataFrame(
        data=[[34, 'null', 'mark'], [22, 'null', 'mark'], [34, 'null', 'mark']],     
        columns=["id", 'temp', 'name'], 
        index=[1, 2, 3]
    )
    result2 = df.apply(pd.value_counts).fillna(0).astype(int)

0

你可以替换为:

fillna(0).astype(int)

fillna(0, downcast='infer')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接