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

JOH*_*OHN 5 python apply pandas

当我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()
Run Code Online (Sandbox Code Playgroud)

创建了这个奇怪的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
Run Code Online (Sandbox Code Playgroud)

Bou*_*oud 5

因此,你将无法避免 level_2 的出现。这是因为分组的结果是一个包含多个项目的数据帧:pandas 足够酷,可以理解您的愿望是通过分组的键广播这些项目,但它会将数据帧的索引作为附加级别来保证一致的输出数据。因此,预计在处理结束时明确删除 level=-1 。

如果您想避免重置该额外索引,但仍然进行一些后处理,另一种方法是调用转换而不是应用,并从您放置要排除的结果的fnc整个组向量中获取返回的数据。np.nan然后,您的数据框将不会有额外的级别,但您需要dropna()稍后调用。