【问题标题】:Pandas + groupby熊猫 + groupby
【发布时间】:2019-02-24 14:13:22
【问题描述】:

数据集包含 4 列,其中 name 是孩子的名字,yearofbirth 表示孩子出生的年份,number 表示以该特定名字命名的婴儿数量。

   For example, entry 1 reads, in the year 1880, 7065 girl children were named Mary.

通过 pandas,我每年都在尝试找出最常用的名字。我的代码

   df.groupby(['yearofbirth']).agg({'number':'max'}).reset_index()

上面的代码部分回答了手头的问题。

我想要名称和最大数量。

【问题讨论】:

  • edit您的帖子将您的数据框显示为文本而不是图像
  • 我看不到您的代码。做有需要的

标签: python pandas pandas-groupby data-analysis


【解决方案1】:

根据this question 的回答,我想出了这个解决方案:

idx = df.groupby(['yearofbirth'])['number'].transform(max) == df['number']
df = df[idx]

print(df)

    name    number  sex yearofbirth
0   Mary    7065    F   1880

【讨论】:

    【解决方案2】:

    如果每年只有一个最大值,我认为需要 - sort_valuesdrop_duplicates

    df = pd.DataFrame({'name':list('abcaac'),
                       'yearofbirth':[1800,1800,1801,1801,1802,1802],
                       'number':[7,8,9,4,2,3],
                       'sex':['F'] * 6,
    })
    
    print (df)
      name  yearofbirth  number sex
    0    a         1800       7   F
    1    b         1800       8   F
    2    c         1801       9   F
    3    a         1801       4   F
    4    a         1802       2   F
    5    c         1802       3   F
    
    df1 = (df.sort_values(['yearofbirth', 'number'], ascending=[True, False])
             .drop_duplicates('yearofbirth'))
    print (df1)
      name  yearofbirth  number sex
    1    b         1800       8   F
    2    c         1801       9   F
    5    c         1802       3   F
    

    如果可能每年有多个最大值,请使用@Teoretic 解决方案。

    【讨论】:

      【解决方案3】:

      你可以试试这个; sort 并获取 last val

      df.sort_values('number').groupby('yearofbirth').tail(1)
      

      或者你可以使用reindex

      df.reindex(df.groupby('yearofbirth').number.idxmax())
      

      演示:

      In [1]: df = pd.DataFrame({'name':list('abcaac'),
          ...:                    'yearofbirth':[1800,1800,1801,1801,1802,1802],
          ...:                    'number':[7,8,9,4,2,3],
          ...:                    'sex':['F'] * 6,
          ...: })
      
      In [2]: df.sort_values('number').groupby('yearofbirth').tail(1)
      Out[2]:
        name  yearofbirth  number sex
      5    c         1802       3   F
      1    b         1800       8   F
      2    c         1801       9   F
      
      
      In [3]: df.reindex(df.groupby('yearofbirth').number.idxmax())
      Out[3]:
             name  yearofbirth  number sex
      number
      1         b         1800       8   F
      2         c         1801       9   F
      5         c         1802       3   F
      
      In [4]: df.loc[df.groupby('yearofbirth').number.idxmax()]
      Out[4]:
        name  yearofbirth  number sex
      1    b         1800       8   F
      2    c         1801       9   F
      5    c         1802       3   F
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 2018-05-16
        • 2021-06-16
        • 2013-10-24
        • 2021-12-24
        • 2019-04-12
        相关资源
        最近更新 更多