首页 > 解决方案 > 提取具有最频繁值的行

问题描述

有一个包含几列的数据框,我想从中为每个具有最频繁数字(“否”)的个人“家庭”提取一行。我已经用一个似乎可以工作的 for 循环对此进行了测试,但作为一个新手,我想知道是否有更短/更智能的方法来做这件事。

这是一个简短的示例代码:

import pandas as pd


ind = [ ('A', 'a', 0.1 , 9) ,
             ('B', 'b', 0.6  , 10) ,
             ('C', 'b', 0.4 , 10) ,
             ('D', 'b', 0.2, 7) ,
             ('E', 'a', 0.9  , 6) ,
             ('F', 'b', 0.7 , 11)
              ]


df = pd.DataFrame(ind, columns = ['Name' , 'Family', 'Prob', 'No'])

res = pd.DataFrame(columns = df.columns)

for name,g in df.groupby('Family'):
    v = g['No'].value_counts().idxmax()
    idx = g['No'] == v
    si = g[idx].iloc[0]
    res = res.append(si)
print(res)

我看过几个这样的例子,我只能得到“家庭”和“否”而不是整行......

标签: pythonpandasfilterpandas-groupby

解决方案


这是使用duplicatedand mode+groupbywith 模式的替代方法:

c = df['No'].eq(df.groupby('Family')['No'].transform(lambda x: x.mode().iat[0]))
c1 = df[['Family','No']].duplicated()
output = df[c & ~c1]

  Name Family  Prob  No
1    B      b   0.6  10
4    E      a   0.9   6

推荐阅读