gpt4 book ai didi

python - 按列分组后如何获取频率最高的元素?

转载 作者:行者123 更新时间:2023-11-28 17:04:03 28 4
gpt4 key购买 nike

我有一个名为 df 的 DataFrame,我想计算列 app_0app_1app_2 中频率最高的元素 不同的性别

import pandas as pd 
import numpy as np
df=pd.DataFrame({'id':[1,2,3,4],'app_0':['a','b','c','d'],
'app_1':['b','c','d',np.nan],'app_2':['c','b','a','a'],'sex':[0,0,1,1]})

输入:

df
id app_0 app_1 app_2 sex
0 1 a b c 0
1 2 b c b 0
2 3 c d a 1
3 4 d NaN a 1

如您所见,id 1id 2sex 都是 0。对于 sex 0bapp_0app_1app_2 列中出现次数最多, c 出现第二多。所以对于id 1id 2,出现频率最高的元素是b,第二多的是c

预期:

df
id app_0 app_1 app_2 sex top_1 top_2
0 1 a b c 0 b c
1 2 b c b 0 b c
2 3 c d a 1 a d
3 4 d NaN a 1 a d

最佳答案

使用自定义函数 stackvalue_counts :

def f(x):
s = x.stack().value_counts()
return pd.Series([s.index[0], s.index[1]], index=['top_1','top_2'])

或者使用 CounterCounter.most_common 的扁平值:

from collections import Counter

def f(x):
c = Counter([y for x in x.values.tolist() for y in x])
a = c.most_common(2)
return pd.Series([a[0][0], a[1][0]], index=['top_1','top_2'])

df1 = df.groupby('sex')['app_0','app_1','app_2'].apply(f)

df = df.join(df1, on='sex')
print (df)
id app_0 app_1 app_2 sex top_1 top_2
0 1 a b c 0 b c
1 2 b c b 0 b c
2 3 c d a 1 a d
3 4 d NaN a 1 a d

编辑:

如果 next 不存在第二个最高值,则更通用的解决方案:

df=pd.DataFrame({'id':[1,2,3,4],'app_0':['a','a','a','a'],
'app_1':['a','a','a',np.nan],'app_2':['a','a','a','a'],'sex':[0,0,1,1]})
print (df)
id app_0 app_1 app_2 sex
0 1 a a a 0
1 2 a a a 0
2 3 a a a 1
3 4 a NaN a 1

def f(x):
c = Counter([y for x in x.values.tolist() for y in x])
a = iter(c.most_common(2))

return pd.Series([next(a, ['no top1'])[0],
next(a, ['no top2'])[0]], index=['top_1','top_2'])

df1 = df.groupby('sex')['app_0','app_1','app_2'].apply(f)

df = df.join(df1, on='sex')
print (df)
id app_0 app_1 app_2 sex top_1 top_2
0 1 a a a 0 a no top2
1 2 a a a 0 a no top2
2 3 a a a 1 a NaN
3 4 a NaN a 1 a NaN

关于python - 按列分组后如何获取频率最高的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52439222/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com