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。我想:

  • 计算姓名(例如John)为0和John为1的频率
  • 返回与出现次数最多的性别值相对应的新数据帧(例如John)
  • 如果性别值0和1具有相同的val_计数,则返回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我补充了一个解释。让我知道现在是否清楚:)