使用熊猫返回最高频率

时间:2020-08-09 02:38:18

标签: python pandas

我有一个数据框

name    country gender  
Ada      US      1
Aby      UK      0
Alan     US      0
Eli      US      1
Eddy     US      1
Bing     NW      0
Bing     US      1
Eli      UK      0
Eli      US      0
Alan     US      1
Ada      UK      0

某些名称分配了不同的性别和国家。例如。以利有美国,有1个也有英国和0。

我用过

groupby('name')['gender]
groupby('name')['code'] 

groupby之后,我希望返回频率最高的“性别”和“国家”。例如,如果Eli有两个美国和一个英国,那么该国家应该是美国。同样的规则也适用于性别。

对于性别,我使用> 0.5规则

df= df_inv.groupby('name')['gender'].mean()
df = df_inv.reset_index()
df['gender'] = (df['gender']>=0.5).astype(int)

有没有更简单的方法来编写此代码?另外,对于国家这样的分类变量,有什么解决方案吗?

3 个答案:

答案 0 :(得分:0)

您应按两个属性(名称和国家/地区/性别)分组,构建表格,然后选择每一行中具有最大值的列:

df.groupby(['name','country']).size().unstack().idxmax(1)
#name
#Aby     UK
#Ada     UK
#Alan    US
#Bing    NW
#Eddy    US
#Eli     US
df.groupby(['name','gender']).size().unstack().idxmax(1)
#name
#Aby     0
#Ada     0
#Alan    0
#Bing    0
#Eddy    1
#Eli     0

如果需要,您以后可以加入结果。

答案 1 :(得分:0)

我们可以通过groupby通过功能modeagg

df = df.groupby('name').agg({'country':lambda x : x.mode()[0],'gender':lambda x : int(x.mean()>0.5)})
Out[154]: 
     country  gender
name                
Aby       UK       0
Ada       UK       0
Alan      US       0
Bing      NW       0
Eddy      US       1
Eli       US       0

答案 2 :(得分:0)

看起来像这样就可以了...请检查并确认

a=df.groupby('name')['gender'].max().to_frame().reset_index()
b=df.groupby('name')['country'].max().to_frame().reset_index()
df=b
df['gender']=a['gender']
del a,b