【问题标题】:pandas value_counts applied to each column应用于每一列的 pandas value_counts
【发布时间】:2014-06-05 12:19:20
【问题描述】:

我有一个dataframe,其中包含来自外部源(csv 文件)的许多列(≈30),但其中一些没有价值或始终相同。因此,我想快速看到每一列的value_counts,我该怎么做?

例如

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

会返回一个对象说明

  • 编号:34 -> 2, 22 -> 1
  • 温度:空 -> 3
  • 名称:标记 -> 3

所以我会知道 temp 是无关紧要的,而 name 是不有趣的(总是一样的)

【问题讨论】:

  • 遍历列并为每个列打印一个value_counts
  • @joris 说了什么。有一个issue给DataFrame添加一个value_counts方法,但是有几个问题与索引对齐有关。

标签: python pandas dataframe


【解决方案1】:

对于数据框,

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

【讨论】:

  • 感谢您的 cmets 和回答。我认为可以在没有循环的情况下做到这一点,但似乎并非如此。 (是的,我已经看到提到的问题,希望它很快就会成为可能:))。
  • 其实,为什么不使用这样的地图:map(lambda x : x.value_counts(), mdf.columns)
  • @Edouard,我认为您上一条评论中的代码必须是 map(lambda x : mdf[x].value_counts(), mdf.columns)
  • to_frame()display() 函数可用于增强输出,例如:for c in df.columns: display(df[c].value_counts().to_frame())
【解决方案2】:

一个很好的方法来做这个并返回一个很好的格式化程序系列是结合pandas.Series.value_countspandas.DataFrame.stack

对于数据帧

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,因此您最终会得到一个DataFrame,它具有相同的列,每列中每个不同的值对应一行(还有很多 null 用于每个未出现在每列中的值)。

之后,T 转置DataFrame(因此您最终得到一个DataFrame,其索引等于列,列等于可能值),stackDataFrame 进入新级别的 MultiIndex 并“删除”所有 Null 值,使整个事物成为 Series

这样的结果是

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

【讨论】:

    【解决方案3】:

    您可以使用df.apply,它将使用提供的函数应用每一列,在这种情况下计算缺失值。就是这个样子,

    df.apply(lambda x: x.isnull().value_counts())

    【讨论】:

      【解决方案4】:

      如下代码

      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
      

      将产生:

      【讨论】:

        【解决方案5】:

        这与@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)
        

        【讨论】:

          【解决方案6】:

          你可以替换:

          fillna(0).astype(int)
          

          fillna(0, downcast='infer')
          

          【讨论】:

            猜你喜欢
            • 2021-09-10
            • 1970-01-01
            • 1970-01-01
            • 2022-12-02
            • 2022-10-14
            • 1970-01-01
            • 2021-10-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多