【问题标题】:pandas groupby transform: multiple functions applied at the same time with custom namespandas groupby 转换:自定义名称同时应用多个函数
【发布时间】:2017-10-21 00:58:36
【问题描述】:

正如标题所示,我希望能够做到以下几点(最好用一些代码来解释)[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,大概是由于multi-index 列排序。有什么办法可以解决这个问题吗?

【问题讨论】:

  • “我会失去“命名”功能”是什么意思?您始终可以通过更改函数名称来重命名新列。您能否添加一个示例来说明问题所在?

标签: pandas multi-index pandas-groupby


【解决方案1】:

如果需要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()])

【讨论】:

  • 从未使用过 group_keys=False。天赐之物。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2017-08-04
相关资源
最近更新 更多