对不同的列采取不同的功能
Taking Different Functions for Different Columns
我有以下数据集。
df = pd.DataFrame({'x': ['A','A','A','A','A','A','A','A','A','A',
'B','B','B','B','B','B','B','B','B','B'],
'ColA': [1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10],
'ColB': np.random.randint(0,100,20),
'ColC': np.random.randint(0,100,20)})
我想按列 x
汇总列 ColA
、ColB
和 ColC
。但是每一列的汇总函数是不同的; ColA
是 max
,列 ColB
和 ColC
是 mean
。我的预期输出如下:
summarization = df.groupby('x').agg({'ColA':'max', 'ColB':'mean', 'ColC':'mean'})
print(summarization)
ColA ColB ColC
x
A 10 52.5 54.9
B 10 64.1 51.0
这里的挑战是列名(ColB
& ColC
是动态的)。此外,我可以有 3 列或 1 列而不是 2 列,我需要 mean
(或 max
)。因此,我需要将几列组合在一起以获取 mean
或 max
.
理想的解决方案是,如果我可以这样做:
df.groupby('x').agg({'ColA':'max', ['ColB','ColC']:'mean'})
可惜agg
函数没有这个功能
是的,agg
不支持使用列表来确定要对哪些列应用聚合,并且 dict
s 不支持 list
s 作为键。不过,如果你使用一些 list-comprehension 魔法,你可以:
aggs = [
('ColA', 'max'),
(df.columns[2:], 'mean'),
]
aggs = dict(item for k,v in aggs for item in (((k,v),) if isinstance(k, str) else [(item,v) for item in k]))
summarization = df.groupby('x').agg(aggs)
输出:
>>> summarization
ColA ColB ColC
x
A 10 49.1 52.8
B 10 53.1 49.9
我有以下数据集。
df = pd.DataFrame({'x': ['A','A','A','A','A','A','A','A','A','A',
'B','B','B','B','B','B','B','B','B','B'],
'ColA': [1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10],
'ColB': np.random.randint(0,100,20),
'ColC': np.random.randint(0,100,20)})
我想按列 x
汇总列 ColA
、ColB
和 ColC
。但是每一列的汇总函数是不同的; ColA
是 max
,列 ColB
和 ColC
是 mean
。我的预期输出如下:
summarization = df.groupby('x').agg({'ColA':'max', 'ColB':'mean', 'ColC':'mean'})
print(summarization)
ColA ColB ColC
x
A 10 52.5 54.9
B 10 64.1 51.0
这里的挑战是列名(ColB
& ColC
是动态的)。此外,我可以有 3 列或 1 列而不是 2 列,我需要 mean
(或 max
)。因此,我需要将几列组合在一起以获取 mean
或 max
.
理想的解决方案是,如果我可以这样做:
df.groupby('x').agg({'ColA':'max', ['ColB','ColC']:'mean'})
可惜agg
函数没有这个功能
是的,agg
不支持使用列表来确定要对哪些列应用聚合,并且 dict
s 不支持 list
s 作为键。不过,如果你使用一些 list-comprehension 魔法,你可以:
aggs = [
('ColA', 'max'),
(df.columns[2:], 'mean'),
]
aggs = dict(item for k,v in aggs for item in (((k,v),) if isinstance(k, str) else [(item,v) for item in k]))
summarization = df.groupby('x').agg(aggs)
输出:
>>> summarization
ColA ColB ColC
x
A 10 49.1 52.8
B 10 53.1 49.9