按列分组以查找另一列中出现频率最高的值? [复制]
Posted
技术标签:
【中文标题】按列分组以查找另一列中出现频率最高的值? [复制]【英文标题】:Group by a column to find the most frequent value in another column? [duplicate] 【发布时间】:2019-02-03 23:36:23 【问题描述】:按列分组以在另一列中查找最常见的值。 示例:
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
【问题讨论】:
我可能不够清楚,但我不想要这个。我只想保留具有最频繁值的行。 对不起,我后来意识到了:( 【参考方案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
或添加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
编辑:
问题仅在于 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
【讨论】:
我尝试将其应用于示例以外的数据框,它显示:IndexError: index 0 is out of bounds for axis 0 with size 0
。你知道为什么吗?
@user10288621 - 当然,等一下。
@user10288621 - 检查已编辑的答案。【参考方案2】:
您可以使用GroupBy
+ transform
和pd.Series.mode
,然后是drop_duplicates
。
使用此解决方案,您的原始数据帧的索引得以保留。它假定只有一种模式,因此每组过滤一种模式。
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
【讨论】:
以上是关于按列分组以查找另一列中出现频率最高的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
循环遍历过滤的单元格列表以检查值是不是出现在另一列中,然后复制/粘贴
如何将约束添加到 MYSQL 中的列仅以保存已存在于同一表的另一列中的值? [复制]
检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中