Python 一个名称对应两个性别,重复数据帧
我有一个如下所示的数据框:Python 一个名称对应两个性别,重复数据帧,python,pandas,Python,Pandas,我有一个如下所示的数据框: Name Gender 0 John 0 1 John 1 2 Linda 1 3 Lisa 0 4 Lisa 1 5 Lisa 1 6 Tom 0 7 Tom 1 8 John 0 在这个数据帧中,像John这样的名字对应两个性别值0和1。我想: 计算姓名(例如John)为0和John为1的频率 返回与出现次数最多的性别值相
Name Gender
0 John 0
1 John 1
2 Linda 1
3 Lisa 0
4 Lisa 1
5 Lisa 1
6 Tom 0
7 Tom 1
8 John 0
在这个数据帧中,像John这样的名字对应两个性别值0和1。我想:
Name Gender
0 John 0
1 Linda 1
2 Lisa 1
3 Tom 0
是否有Python Panda代码可以解决此问题而不是使用for循环?因为性别是一个二进制值-您需要的是计算性别的平均值,并检查它是否大于或等于0.5:
new_df = df.groupby('name')['gender'].mean()
new_df = new_df.reset_index()
new_df['gender'] = (new_df['gender']>=0.5).astype(int)
new_df
name gender
0 Jhon 0
1 Linda 1
2 Lisa 1
3 Tom 1
对于每个名称,它计算平均值,这意味着如果Jhon有[0,0,1],平均值为0.3333,而如果它有[1,0,1],平均值为0.6666
如果平均值大于0.5,则表示1多于0,反之亦然。这正是我们正在检查的new_df['gender']>=0.5
。
然后我们必须将它从布尔值(真/假)转换为int(真将变为1,假为0)-我们使用
astype(int)
只需按名称分组并找到模式
df.groupby('Name')['Gender'].agg(lambda x: x.mode().max())
Name
John 0
Linda 1
Lisa 1
Tom 1
Name: Gender, dtype: int64
“模式”是“最常出现的值”。如果有多个模式,pd.Series.mode
返回所有模式,因此我们返回最大的模式
类似的方法可以避免lambda:
df.groupby('Name')['Gender'].apply(pd.Series.mode).max(level=0, axis=0)
Name
John 0
Linda 1
Lisa 1
Tom 1
Name: Gender, dtype: int64
注意,Tom必须是1(根据3-如果性别值0和1具有相同的val_计数,返回1),因为人们想知道
模式
可以做什么,@Sushanth噢,嘿,我想我认识写这篇文章的人。谢谢,但是,如果值大于0,小于1呢。在这种情况下,我需要返回0。例如,John有两个0和一个1。您是如何使其返回0的。你能解释一下吗?@KeFeng我补充了一个解释。让我知道现在是否清楚:)