pandas groupby transform:同时应用多个自定义命名函数的方法

3

如标题所示,我想要能够进行以下操作(最好通过一些代码来解释)[pandas 0.20.1是必需的]

import pandas as pd
import numpy as np

a = pd.DataFrame(np.random.rand(10, 4), columns=[['a','a','b','b'], ['alfa','beta','alfa','beta',]])

def as_is(x):
    return x
def power_2(x):
    return x**2

# desired result

a.transform([as_is, power_2])

问题在于函数可能比这个更复杂,因此我会失去“命名”的功能,因为 pandas.DataFrame.transform 只允许传递列表,而字典是最方便的选择。

回归基础,我得到了下面这个:

dict_funct= {'as_is': as_is, 'power_2': power_2}

def wrapper(x):
    return pd.concat({k: x.apply(v) for k,v in dict_funct.items()}, axis=1)

a.groupby(level=[0,1], axis=1).apply(wrapper)

但输出的数据框中所有列都是 nan,可能是由于多重索引列的排序。有什么方法可以解决这个问题吗?


“我会失去“命名”功能”是什么意思?您可以通过更改函数名称来重命名新列。您能否举个例子说明问题在哪里? - Allen Qin
1个回答

3
如果需要使用字典,我会将concat函数中的参数axis移除以使用默认值(axis=0),但是接下来需要添加group_keys=False参数和unstack函数。
def wrapper(x):
    return pd.concat({k: x.apply(v) for k,v in dict_funct.items()})

a.groupby(level=[0,1], axis=1, group_keys=False).apply(wrapper).unstack(0)

类似的解决方案:

def wrapper(x):
    return pd.concat({k: x.transform(v) for k,v in dict_funct.items()})

a.groupby(level=[0,1], axis=1, group_keys=False).apply(wrapper).unstack(0)

另一种解决方案是简单地添加列表推导式
a.transform([v for k, v in dict_funct.items()])

从来没有使用过 group_keys=False,这真是太棒了。谢谢! - Asher11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接