如何获取pandas数据帧对象值的模式?

时间:2018-01-14 16:16:00

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

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

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

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

  3. 这些值出现的频率是多少?

  4. 我从一个大型数据框(df)开始。我感兴趣的专栏叫做'名字'。首先,我使用collection.Counter来获取'names'列中每个唯一值的出现次数:

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

    这给了我一个包含以下内容的pandas数据框:

    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 = [John,Ryan]

    答案#2 = 2

    答案#3 = 126

    我不相信使用计数器是最好的选择,因此我对保留在数据帧内的选项持开放态度,而不会在数据帧之间反弹以反击数据帧。

5 个答案:

答案 0 :(得分:4)

您可以直接从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

答案 1 :(得分:2)

有一个帮助方法可以满足您的需求: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)

答案 2 :(得分:1)

因为你提到了模式

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

答案 3 :(得分:0)

您也可以使用内置模式的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

答案 4 :(得分:0)

我知道我迟到了,但我已经这样做了 - 您需要在 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'
                    ]