Python 为什么在熊猫中使用apply时会有一个额外的索引

Python 为什么在熊猫中使用apply时会有一个额外的索引,python,pandas,apply,Python,Pandas,Apply,当我在Pandas中对用户定义的函数使用apply时,看起来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,

当我在Pandas中对用户定义的函数使用
apply
时,看起来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()

因此,您将无法避免出现级别2。这是因为分组的结果是一个包含多个项的数据帧:pandas很酷,可以理解您希望在分组的键之间广播这些项,但是它将数据帧的索引作为一个额外的级别,以保证一致的输出数据。因此,在处理结束时显式删除level=-1是应该的


如果您希望避免重置额外的索引,但仍有一些后期处理,另一种方法是调用transform而不是apply,并从
fnc
获取返回的数据,该数据是放置
np.nan
以排除结果的整个组向量。然后,您的数据帧将不会有额外的级别,但您需要在之后调用
dropna()

您在跟踪:
data[data.C<0]
?您想完成什么。这并不明显,为什么要在
fnc
中返回一个数据帧?你的导出结果是什么,为什么首先要做一个groupby?看起来简单的
data[data['C']<0]
对你来说应该行得通。我的问题是为什么要创建一个列“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