pandas groupby transform:使用自定义名称

时间:2017-05-21 08:24:09

标签: pandas multi-index pandas-groupby

正如标题所示,我希望能够做到以下(最好用一些代码解释)[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)

但输出Dataframe全部为nan,可能是由于multi-index列排序。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

如果需要dict,我会将axis中的参数concat删除为默认值(axis=0),但必须添加参数group_keys=False和函数{{ 3}}:

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)

另一种解决方案是添加list comprehension

a.transform([v for k, v in dict_funct.items()])