python - 按列分组以查找另一列中出现频率最高的值?
问题描述
按列分组以在另一列中查找最常见的值。例子:
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
解决方案
使用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
s 组:
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
推荐阅读
- javascript - 无法从 useEffect 更新 React 状态挂钩
- dart - 如何使用 RxDart BehaviorSubject 更新颤振小部件?
- asp.net - 如何修复链接页面与同一网站中的另一个页面
- python-3.x - 在匹配列中的值后在一个图中绘制两个图
- c++ - 警告 C26451:算术溢出
- python - 为什么 stdin.readline 直到最后才读取
- mysql - 选择某些列从未失败某些条件的行
- reactjs - 在渲染函数返回时反应注册页面语法错误
- bokeh - 散景:x_range 的 CustomJS 更改导致重复因素或子因素错误
- api - Syncfusion TreeGrid 和带有 WebAPI 的网格在删除时不起作用