我有一个数据框
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)
有没有更简单的方法来编写此代码?另外,对于国家这样的分类变量,有什么解决方案吗?
答案 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
通过功能mode
来agg
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