为什么在Pandas中使用apply时会有额外的索引

时间:2017-02-08 21:41:06

标签: python pandas apply

当我将apply用于Pandas中的用户定义函数时,看起来python正在创建一个额外的数组。我怎么能摆脱它?这是我的代码:

def fnc(group):
    x = group.C.values
    out = x[np.where(x < 0)]
    return pd.DataFrame(out)

data = pd.DataFrame({'A':np.random.randint(1, 3, 10),
                     'B':3,
                     'C':np.random.normal(0, 1, 10)})

data.groupby(by=['A', 'B']).apply(fnc).reset_index()

创建了这个奇怪的Level_2索引。有没有办法避免在运行我的函数时创建它?

    A   B   level_2   0
0   1   3   0        -1.054134802
1   1   3   1        -0.691996447
2   2   3   0        -1.068693768
3   2   3   1        -0.080342046
4   2   3   2        -0.181869799

1 个答案:

答案 0 :(得分:3)

因此,您将无法避免出现level_2。这是因为您的分组结果是一个包含多个项目的数据框:pandas足够酷,可以理解您希望在分组密钥中广播这些项目,但它将数据框的索引作为额外级别来保证相干输出数据。因此,在处理结束时明确地降低level = -1。

如果你想避免重置那个额外的索引,但仍然有一些后期处理,另一种方法是调用transform而不是apply,并从fnc获取返回的数据作为整个组向量将np.nan放在要排除的结果中。然后,您的数据框架将没有额外的级别,但您之后需要致电dropna()