【问题标题】:How to get rid of nested column names in Pandas from group by aggregation?如何通过聚合从组中删除 Pandas 中的嵌套列名?
【发布时间】:2019-03-15 19:30:13
【问题描述】:

我有以下代码,它使用Employee_id 的组和Customer_id 的聚合来查找每个员工的总销售额和唯一销售额。

Sales.groupby('Employee_id').agg({
    'Customer_id': [
        ('total_sales', 'count'),
        ('unique_sales', 'nunique')
]})

重要的是要知道我也会对其他列执行聚合,但到目前为止,这就是我所写的全部内容。因此,如果您有建议的解决方案,请您考虑一下,以防它产生影响。

虽然这在计算每个员工的总销售额和唯一销售额并创建两列方面完全符合我的要求,但它会创建嵌套的列名称。所以列名看起来像 [('Customer_id', 'total_sales'), ('Customer_id', 'unique_sales')],这是我不想要的。有什么方法可以轻松摆脱嵌套部分,只包含 ['total_sales', 'unique_sales'],或者在我完成所有内容后重命名列是最简单的方法吗?

谢谢!

【问题讨论】:

    标签: python pandas aggregate-functions pandas-groupby columnname


    【解决方案1】:

    您可以简单地重命名列:

    import numpy as np
    import pandas as pd
    np.random.seed(2018)
    
    df = pd.DataFrame(np.random.randint(10, size=(100, 3)), columns=['A','B','C'])
    result = df.groupby('A').agg({'B': [('D','count'),('E','nunique')],
                                  'C': [('F','first'),('G','max')]})
    result.columns = result.columns.get_level_values(1)
    print(result)
    

    或者,您可以保存 groupby 对象,并使用 grouped[col].agg(...) 生成子数据帧,然后可以pd.concat'ed 一起:

    import numpy as np
    import pandas as pd
    np.random.seed(2018)
    df = pd.DataFrame(np.random.randint(10, size=(100, 3)), columns=['A','B','C'])
    grouped = df.groupby('A')
    result = pd.concat([grouped['B'].agg([('D','count'),('E','nunique')]),
                        grouped['C'].agg([('F','first'),('G','max')])], axis=1)
    print(result)
    

    两个代码 sn-ps 产生以下结果(尽管列的顺序可能不同):

        D  E  F  G
    A             
    0  18  8  8  9
    1  12  8  6  6
    2  14  8  0  8
    3  10  9  8  9
    4   7  6  3  5
    5   8  5  6  7
    6   9  7  9  9
    7   8  6  4  7
    8   8  7  2  9
    9   6  5  7  9
    

    总的来说,我认为事后重命名列是最简单且更具可读性的选项。

    【讨论】:

    • 非常感谢您清楚地显示这两个选项!我更喜欢第一个:)
    • 快速跟进,您知道如何将索引(在您的示例中为 A)设为列而不是索引吗?
    • 通常你可以通过使用df.groupby('A', as_index=False)来避免这个问题。这告诉groupby/agg 返回一个DataFrame,其中A 是一个列而不是索引。但在这种情况下,这不起作用,因为 A 被放置在由 result.columns = result.columns.get_level_values(1) 删除的第 0 列级别。
    • 所以改为使用result = result.reset_index() 将索引移动到列中。 (顺便说一下,result.set_index 是您用来进行反向操作的方法——将列移动到索引中。)
    • 我喜欢 pandas 的地方在于它非常直观且易于排除故障
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多