【问题标题】:Count the frequency that a value occurs in a dataframe column计算一个值在数据框列中出现的频率
【发布时间】:2014-04-18 22:38:36
【问题描述】:

我有一个数据集

category
cat a
cat b
cat a

我希望能够返回类似(显示唯一值和频率)

category   freq 
cat a       2
cat b       1

【问题讨论】:

标签: python pandas frequency


【解决方案1】:

正如大家所说,更快的解决方案是:

df.column_to_analyze.value_counts()

但是,如果您想在数据框中使用输出,请使用此架构:

df input:

category
cat a
cat b
cat a

df output: 

category   counts
cat a        2
cat b        1 
cat a        2

你可以这样做:

df['counts'] = df.category.map(df.category.value_counts())
df 

【讨论】:

    【解决方案2】:

    以下代码在名为“smaller_dat1”的数据框中为名为“Total_score”的列中的各种值创建频率表,然后返回值“300”在列中出现的次数。

    valuec = smaller_dat1.Total_score.value_counts()
    valuec.loc[300]
    

    【讨论】:

      【解决方案3】:

      使用groupbycount

      In [37]:
      df = pd.DataFrame({'a':list('abssbab')})
      df.groupby('a').count()
      
      Out[37]:
      
         a
      a   
      a  2
      b  3
      s  2
      
      [3 rows x 1 columns]
      

      查看在线文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html

      value_counts()@DSM 评论说,这里有很多剥猫皮的方法

      In [38]:
      df['a'].value_counts()
      
      Out[38]:
      
      b    3
      a    2
      s    2
      dtype: int64
      

      如果您想将频率添加回原始数据帧,请使用 transform 返回对齐索引:

      In [41]:
      df['freq'] = df.groupby('a')['a'].transform('count')
      df
      
      Out[41]:
      
         a freq
      0  a    2
      1  b    3
      2  s    2
      3  s    2
      4  b    3
      5  a    2
      6  b    3
      
      [7 rows x 2 columns]
      

      【讨论】:

        【解决方案4】:
        df.apply(pd.value_counts).fillna(0)
        

        value_counts - 返回包含唯一值计数的对象

        apply - 每列的计数频率。如果你设置axis=1,你会得到每一行的频率

        fillna(0) - 使输出更花哨。将 NaN 更改为 0

        【讨论】:

          【解决方案5】:

          我相信这应该适用于任何 DataFrame 列列表。

          def column_list(x):
              column_list_df = []
              for col_name in x.columns:
                  y = col_name, len(x[col_name].unique())
                  column_list_df.append(y)
          return pd.DataFrame(column_list_df)
          
          column_list_df.rename(columns={0: "Feature", 1: "Value_count"})
          

          函数“column_list”检查列名,然后检查每个列值的唯一性。

          【讨论】:

          • 您可以添加关于您的代码如何工作以改进您的答案的简要说明。
          【解决方案6】:
          your data:
          
          |category|
          cat a
          cat b
          cat a
          

          解决方案:

           df['freq'] = df.groupby('category')['category'].transform('count')
           df =  df.drop_duplicates()
          

          【讨论】:

            【解决方案7】:
            df.category.value_counts()
            

            这行简短的代码将为您提供所需的输出。

            如果你的列名有空格,你可以使用

            df['category'].value_counts()
            

            【讨论】:

            • 如果列名有空格,则使用 []df['category 1'].value_counts()
            【解决方案8】:

            @metatoaster 已经指出了这一点。 去Counter。它燃烧得很快。

            import pandas as pd
            from collections import Counter
            import timeit
            import numpy as np
            
            df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])
            

            计时器

            %timeit -n 10000 df['NumA'].value_counts()
            # 10000 loops, best of 3: 715 µs per loop
            
            %timeit -n 10000 df['NumA'].value_counts().to_dict()
            # 10000 loops, best of 3: 796 µs per loop
            
            %timeit -n 10000 Counter(df['NumA'])
            # 10000 loops, best of 3: 74 µs per loop
            
            %timeit -n 10000 df.groupby(['NumA']).count()
            # 10000 loops, best of 3: 1.29 ms per loop
            

            干杯!

            【讨论】:

              【解决方案9】:
              n_values = data.income.value_counts()
              

              第一个唯一值计数

              n_at_most_50k = n_values[0]
              

              第二个唯一值计数

              n_greater_50k = n_values[1]
              
              n_values
              

              输出:

              <=50K    34014
              >50K     11208
              
              Name: income, dtype: int64
              

              输出:

              n_greater_50k,n_at_most_50k:-
              (11208, 34014)
              

              【讨论】:

                【解决方案10】:

                您也可以通过首先将您的列广播为类别来对 pandas 进行此操作,例如dtype="category" 例如

                cats = ['client', 'hotel', 'currency', 'ota', 'user_country']
                
                df[cats] = df[cats].astype('category')
                

                然后调用describe:

                df[cats].describe()
                

                这将为您提供一个漂亮的值计数表以及更多内容:):

                    client  hotel   currency    ota user_country
                count   852845  852845  852845  852845  852845
                unique  2554    17477   132 14  219
                top 2198    13202   USD Hades   US
                freq    102562  8847    516500  242734  340992
                

                【讨论】:

                  【解决方案11】:

                  如果你的DataFrame有相同类型的值,你也可以在numpy.unique()中设置return_counts=True

                  index, counts = np.unique(df.values,return_counts=True)

                  如果您的值是整数,np.bincount() 可能会更快。

                  【讨论】:

                    【解决方案12】:

                    没有任何库,您可以这样做:

                    def to_frequency_table(data):
                        frequencytable = {}
                        for key in data:
                            if key in frequencytable:
                                frequencytable[key] += 1
                            else:
                                frequencytable[key] = 1
                        return frequencytable
                    

                    例子:

                    to_frequency_table([1,1,1,1,2,3,4,4])
                    >>> {1: 4, 2: 1, 3: 1, 4: 2}
                    

                    【讨论】:

                      【解决方案13】:

                      在 0.18.1 groupbycount 中没有给出唯一值的频率:

                      >>> df
                         a
                      0  a
                      1  b
                      2  s
                      3  s
                      4  b
                      5  a
                      6  b
                      
                      >>> df.groupby('a').count()
                      Empty DataFrame
                      Columns: []
                      Index: [a, b, s]
                      

                      但是,使用size 可以轻松确定唯一值及其频率:

                      >>> df.groupby('a').size()
                      a
                      a    2
                      b    3
                      s    2
                      

                      默认返回df.a.value_counts() 排序后的值(按降序,即最大值在前)。

                      【讨论】:

                        【解决方案14】:

                        如果你想应用到你可以使用的所有列:

                        df.apply(pd.value_counts)
                        

                        这将对每个列应用基于列的聚合函数(在本例中为 value_counts)。

                        【讨论】:

                          【解决方案15】:

                          对 df 中的多个列使用列表理解和 value_counts

                          [my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
                          

                          https://stackoverflow.com/a/28192263/786326

                          【讨论】:

                            猜你喜欢
                            • 2022-11-28
                            • 2022-01-27
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多