如何通过聚合摆脱 Pandas 中的嵌套列名?

Jan*_*lly 3 python group-by aggregate-functions dataframe pandas

我有以下代码,使用 group by withEmployee_id和aggregation with来查找每个员工的总销售额和唯一销售额Customer_id

Sales.groupby('Employee_id').agg({
    'Customer_id': [
        ('total_sales', 'count'),
        ('unique_sales', 'nunique')
]})
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

unu*_*tbu 5

您可以简单地重命名列:

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)
Run Code Online (Sandbox Code Playgroud)

或者,您可以保存groupby对象,并用于grouped[col].agg(...) 生成子数据帧,然后可以将其pd.concat组合在一起:

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)
Run Code Online (Sandbox Code Playgroud)

两个代码片段都会产生以下内容(尽管列的顺序可能不同):

    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
Run Code Online (Sandbox Code Playgroud)

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

  • 因此,请使用“result = result.reset_index()”将索引移动到列中。(顺便说一句,“result.set_index”是您用来执行反向操作的方法——将列移动到索引中。) (2认同)