在群组中查找最频繁的观察

时间:2017-04-20 15:16:11

标签: python pandas dataframe

数据帧:

B = pd.DataFrame({'b':['II','II','II','II','II','I','I','I'],
                  'MOST_FREQUENT':['1', '2', '2', '1', '1','1','2','2']})

我需要在每个组的MOST_FREQUENT列中获得最常见的值:

pd.DataFrame({'b':['I','II'],
                      'MOST_FREQUENT':['2','1']})

我发现的唯一线索 - mode(),但不适用于DataFrameGroupBy

编辑:我需要一个满足大熊猫的解决方案。 .agg()功能

2 个答案:

答案 0 :(得分:2)

您可以使用apply

print (B.groupby('b')['MOST_FREQUENT'].apply(lambda x: x.mode())
        .reset_index(level=1, drop=True).reset_index())
    b MOST_FREQUENT
0   I             2
1  II             1

另一个解决方案是使用SeriesGroupBy.value_counts并返回第一个index值,因为value_counts对值进行排序:

print (B.groupby('b')['MOST_FREQUENT'].apply(lambda x: x.value_counts().index[0])
        .reset_index())
    b MOST_FREQUENT
0   I             2
1  II             1

编辑:您可以使用most_common

from collections import Counter
print (B.groupby(['b']).agg(lambda x: Counter(x).most_common(1)[0][0]).reset_index())
    b MOST_FREQUENT
0   I             2
1  II             1

答案 1 :(得分:2)

尝试从熊猫中获得更多性能,我们可以使用groupby大小来获取计数。然后使用idxmax查找最大子组的索引值。这些指数将是我们正在寻找的价值。

s = B.groupby(['MOST_FREQUENT', 'b']).size()
pd.DataFrame(
    s.groupby(level='b').idxmax().values.tolist(),
    columns=s.index.names
)

  MOST_FREQUENT   b
0             2   I
1             1  II

天真的时间

enter image description here