首页 > 解决方案 > 按列分组以查找另一列中出现频率最高的值?

问题描述

按列分组以在另一列中查找最常见的值。例子:

import pandas as pd
d = {'col1': ['green','green','green','blue','blue','blue'],'col2': ['gx','gx','ow','nb','nb','mj']}
df = pd.DataFrame(data=d)
df

给出:

col1   col2
green  gx
green  gx
green  ow
blue   nb
blue   nb
blue   xv

结果:

为了green拥有gx和为了blue拥有nb

标签: pythonpandasgroup-bypandas-groupby

解决方案


使用SeriesGroupBy.value_counts并选择索引的第一个值:

df = df.groupby('col1')['col2'].apply(lambda x: x.value_counts().index[0]).reset_index()
print (df)
    col1 col2
0   blue   nb
1  green   gx

或添加DataFrame.drop_duplicates

df = df.groupby('col1')['col2'].value_counts().reset_index(name='v')

df = df.drop_duplicates('col1')[['col1','col2']]
print (df)
    col1 col2
0   blue   nb
2  green   gx

或使用Series.mode并按位置选择第一个值Series.iat

df = df.groupby('col1')['col2'].apply(lambda x: x.mode().iat[0]).reset_index()
print (df)
    col1 col2
0   blue   nb
1  green   gx

编辑:

问题只有NaNs 组:

d = {'col1': ['green','green','green','blue','blue','blue'],
     'col2': [np.nan,np.nan,np.nan,'nb','nb','mj']}
df = pd.DataFrame(data=d)

f = lambda x: np.nan if x.isnull().all() else x.value_counts().index[0]
#or
#f = lambda x: next(iter(x.value_counts().index), np.nan)
#another solution
#f = lambda x: next(iter(x.mode()), np.nan)
df = df.groupby('col1')['col2'].apply(f).reset_index()
print (df)
    col1 col2
0   blue   nb
1  green  NaN

推荐阅读