代码之家  ›  专栏  ›  技术社区  ›  Ric S

聚合后排序和选择(熊猫)

  •  1
  • Ric S  · 技术社区  · 7 年前

    我想聚合一个熊猫数据帧,以便计算子对象的数量(变量 儿童姓名 )对于每个父亲(变量 父姓 ) 数据框架看起来是这样的(当然,它是一个玩具示例,我想掌握这个概念):

    father_name   child_name
    Robert        Julian
    Robert        Emily
    Robert        Dan
    Carl          Jack
    Carl          Rose
    John          Lucy
    Paul          Christopher
    Paul          Thomas
    

    现在,我定义了 聚集 字典并在数据帧上使用它 D :

    import pandas as pd
    aggregation = {
        'child_name': {
            'n_children': 'count'
        }
    }
    d.groupby('father_name').agg(aggregation)
    

    我得到这个输出:

                child_name
                n_children
    father_name           
    Carl                 2
    John                 1
    Paul                 2
    Robert               3
    

    现在我想:

    • 根据父亲的子女数量对父亲进行分类(按降序排列)
    • 只显示有两个或更多孩子的父亲

    我该怎么做?也许还有一种更快的方法,但我也想学习这个方法。事先谢谢!

    2 回复  |  直到 7 年前
        1
  •  2
  •   fuglede    7 年前

    你可以让

    df_count = df.groupby('father_name').count()
    df_count[df_count.child_name > 1].sort_values(by='child_name', ascending=False)
    

    输出:

                 child_name
    father_name
    Robert                3
    Carl                  2
    Paul                  2
    

    如果你想更多地利用 agg ,这可能类似于以下内容 扔一个 FutureWarning 由于不推荐使用dicts重命名):

    df.groupby('father_name').agg({'child_name': {'n_children': lambda x: len(x) if len(x) > 1 else None}}).dropna()
    

    然后对结果进行排序。

        2
  •  0
  •   A l w a y s S u n n y    7 年前

    让我们试着这样来满足你的两个条件-

        import pandas as pd
        df = pd.DataFrame({"father_name":["Robert","Robert","Robert","Carl","Carl","John","Paul","Paul"],"child_name":["Julian","Emily","Dan","Jack","Rose","Lucy","Christopher","Thomas"]})
    
        #sort the fathers according to their number of children (in decreasing order)
        df = df.groupby(by='father_name').count().sort_values(['child_name'],ascending=False)
    
        #show only the fathers that have 2 or more children
        df_greater_2 = df[df['child_name'] >= 2]
    
        print(df_greater_2)
    

    演示: https://repl.it/@SanyAhmed/EarnestTatteredRepo