按一列分组以在另一列中查找最频繁的值。 示例:
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
答案 0 :(得分:1)
使用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
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
编辑:
问题仅存在NaN
个组:
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
答案 1 :(得分:1)
您可以在pd.Series.mode
和drop_duplicates
中使用GroupBy
+ transform
。
使用此解决方案,可以维护原始数据帧中的索引。它假定只有一种模式,因此每组过滤一种模式。
modes = df.groupby('col1')['col2'].transform(lambda x: x.mode().iat[0])
res = df[df['col2'] == modes].drop_duplicates()
print(res)
col1 col2
0 green gx
3 blue nb