【问题标题】:How can I get mode(s) of pandas dataframe object values?如何获取 pandas 数据框对象值的模式?
【发布时间】:2018-06-23 09:49:34
【问题描述】:

我有一个包含许多列的pandas.DataFrame。我只对 type = 'object' 的那些列('names')中的一个感兴趣。关于本专栏,我想回答三个问题:

  1. 除了 nan 值之外,哪些值最常出现?

  2. 有多少值符合该标准(答案 #1 中的值计数)?

  3. 这些值多久出现一次?

我从一个大型数据框 (df) 开始。我感兴趣的列称为“名称”。首先,我使用 collection.Counter 来获取“名称”列中每个唯一值的出现次数:

In [52]: cntr = collections.Counter([r for i, r in df['names'].dropna().iteritems()])
Out[52]: Counter({'Erk': 118,
    'James': 120,
    'John': 126,
    'Michael': 129,
    'Phil': 117,
    'Ryan': 126})

然后我将 Counter 转换回数据框:

In [53]: df1 = pd.DataFrame.from_dict(cntr, orient='index').reset_index()
In [54]: df1 = df1.rename(columns={'index':'names', 0:'cnt'})

这给了我一个熊猫数据框,其中包含:

In [55]: print (type(df1), df1)
Out[55]: <class 'pandas.core.frame.DataFrame'>
       names    cnt
    0      Erk  118
    1    James  120
    2     Phil  117
    3     John  126
    4  Michael  122
    5     Ryan  126

下一部分是我需要一些帮助的地方。在这个例子中我想要的输出是:

答案 #1 = [约翰,瑞恩]

答案 #2 = 2

答案 #3 = 126

我不相信使用 Counter 是最佳选择,因此我愿意接受保留在数据框内而不在数据框之间弹跳以反击回数据框的选项。

【问题讨论】:

标签: python python-3.x pandas dataframe counter


【解决方案1】:

我知道我迟到了,但我已经完成了 - 你需要在 python 中导入统计模块以及 pandas。

data_cut = data.groupby(['HIGH_LEVEL_CATEGORY','SKU']).agg({'M2': ['mean','median', 'min', 'max', 'count', 'var', 'std', 'sum', stats.mode]
                                           }).sort_index().reset_index()

data_cut.columns = ['HIGH_LEVEL_CATEGORY'
                    ,'SKU'
                    , 'M2_Mean'
                    ,'M2_Median'
                    , 'M2_Min'
                    , 'M2_Max'
                    , 'M2_Count'
                    , 'M2_Var'
                    , 'M2_Std'
                    , 'M2_Sum'
                    , 'M2_Mode'
                    ]

【讨论】:

    【解决方案2】:

    您也可以使用 pandas 内置模式,即

    m = df1['cnt'].mode()
    0    126
    dtype: int64
    
    sum(df1['cnt'].isin(m))
    2
    
    df1[df1['cnt'].isin(m)]['names']
    
    3    Ryan
    4    John
    Name: names, dtype: object
    

    【讨论】:

      【解决方案3】:

      既然你提到了模式

      from scipy import stats
      Val,cnt=stats.mode(df1.cnt)
      Val
      Out[349]: array([126], dtype=int64)
      cnt
      Out[350]: array([2])
      
      df1.names[df1.cnt.isin(Val)].tolist()
      Out[358]: ['John', 'Ryan']
      

      【讨论】:

        【解决方案4】:

        有一个帮助方法可以满足您的需求:value_counts()。即使对于大型数据帧,它也很有效。

        df1 = df['names'].value_counts()
        # question 3
        q3 = df1.max()
        # question 1
        q1 = df1.loc[df1 == q3].index.tolist()
        # question 2
        q2 = len(q1)
        

        【讨论】:

          【解决方案5】:

          您可以直接从Counter 获取该信息,例如:

          代码:

          from collections import Counter
          
          data = Counter({'Erk': 118, 'James': 120, 'John': 126,
                          'Michael': 122, 'Phil': 117, 'Ryan': 126})
          
          by_count = {}
          for k, v in data.items():
               by_count.setdefault(v, []).append(k)
          max_value = max(by_count.keys())
          print(by_count[max_value], len(by_count[max_value]), max_value)
          

          结果:

          ['John', 'Ryan'] 2 126
          

          【讨论】:

          • 正是我需要的。感谢您的快速回复!
          猜你喜欢
          • 2021-04-07
          • 1970-01-01
          • 1970-01-01
          • 2017-03-09
          • 2016-10-15
          • 2023-03-03
          • 2015-05-12
          • 2022-01-02
          • 2020-03-05
          相关资源
          最近更新 更多