代码之家  ›  专栏  ›  技术社区  ›  DonnRK

如何获取熊猫数据框对象值的模式?

  •  6
  • DonnRK  · 技术社区  · 7 年前

    我有一个 pandas.DataFrame 包含许多列。我只对其中一个类型为“object”的列(“name”)感兴趣。我想回答有关本专栏的三个问题:

    1. 除nan值外,最常出现的值是什么?

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

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

    我从一个大型数据帧(df)开始。我感兴趣的专栏叫做“名称”。首先,我使用了collection。计数器获取“名称”列中每个唯一值的出现次数:

    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})
    

    然后我将计数器转换回数据帧:

    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

    我不相信使用计数器是最好的选择,所以我愿意选择留在数据帧内的选项,而不会在数据帧之间反弹以计数器返回到数据帧。

    5 回复  |  直到 7 年前
        1
  •  4
  •   Stephen Rauch Afsar Ali    7 年前

    您可以直接从 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
    
        2
  •  2
  •   Prikers    7 年前

    有一个帮助器方法可以满足您的需要: 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)
    
        3
  •  1
  •   BENY    7 年前

    既然你提到模式

    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
  •  0
  •   Bharath M Shetty    7 年前

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

    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
    
        5
  •  0
  •   Bilal Mussa    3 年前

    我知道我迟到了,但我已经做到了——您需要将统计模块与pandas一起导入python。

    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'
                        ]