Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从group by聚合中去掉熊猫中嵌套的列名?_Python_Pandas_Aggregate Functions_Pandas Groupby_Columnname - Fatal编程技术网

Python 如何从group by聚合中去掉熊猫中嵌套的列名?

Python 如何从group by聚合中去掉熊猫中嵌套的列名?,python,pandas,aggregate-functions,pandas-groupby,columnname,Python,Pandas,Aggregate Functions,Pandas Groupby,Columnname,我有以下代码,它使用带有employee\u id的group by和带有Customer\u id的聚合来查找每个员工的总销售额和唯一销售额 Sales.groupby('Employee_id').agg({ 'Customer_id': [ ('total_sales', 'count'), ('unique_sales', 'nunique') ]}) 重要的是要知道,我还将对其他列执行聚合,但到目前为止,我只写了这些。所以,如果你有一个建议的解

我有以下代码,它使用带有
employee\u id
的group by和带有
Customer\u id
的聚合来查找每个员工的总销售额和唯一销售额

Sales.groupby('Employee_id').agg({
    'Customer_id': [
        ('total_sales', 'count'),
        ('unique_sales', 'nunique')
]})
重要的是要知道,我还将对其他列执行聚合,但到目前为止,我只写了这些。所以,如果你有一个建议的解决方案,我请你考虑,如果它有区别。

在计算每个员工的总销售额和唯一销售额并创建两列方面,这正是我想要的,但它创建了嵌套的列名。所以列名看起来像[('Customer\u id','total\u sales'),('Customer\u id','unique\u sales')],这是我不想要的。是否有任何方法可以轻松摆脱嵌套部分,只包含['total_sales'、'unique_sales'],或者在我完成所有操作后重命名列是最简单的方法


谢谢

您可以简单地重命名这些列:

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
”合并在一起:

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)
这两个代码段都会产生以下结果(尽管列的顺序可能不同):


总的来说,我认为在事实发生后重命名列是最简单、可读性更强的选项。

非常感谢您清楚地显示了这两个选项!我更喜欢第一个:)快速跟进,您知道如何将索引(在您的示例中为A)设置为列而不是索引吗?通常您可以通过使用
df.groupby('A',as_index=False)
来避免此问题。这告诉
groupby/agg
返回一个数据帧,其中
a
是一列而不是索引。但是在这种情况下,这不起作用,因为
A
被放置在第0列级别,该级别由
result.columns=result.columns.get_level_值(1)
删除。因此使用
result=result.reset_index()
将索引移动到列中。(顺便说一句,
result.set_index
是执行反向操作的方法——将列移动到索引中。)我喜欢pandas的地方在于它非常直观,而且很容易排除故障
    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