pandas groupby 转换:同时应用自定义名称的多个函数
pandas groupby transform: multiple functions applied at the same time with custom names
如标题所示,我希望能够执行以下操作(最好用一些代码进行解释)[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])
问题是函数可能比这更复杂,因此我会失去 "naming" 功能,因为 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
列排序。有什么办法可以解决这个问题吗?
如果需要 dict
我将 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)
另一个解决方案是简单地添加 list comprehension
:
a.transform([v for k, v in dict_funct.items()])
如标题所示,我希望能够执行以下操作(最好用一些代码进行解释)[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])
问题是函数可能比这更复杂,因此我会失去 "naming" 功能,因为 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
列排序。有什么办法可以解决这个问题吗?
如果需要 dict
我将 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)
另一个解决方案是简单地添加 list comprehension
:
a.transform([v for k, v in dict_funct.items()])