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,
                     '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

最佳答案

如此一来,你就无法避免level_2的出现。这是因为您的分组结果是一个包含多个项目的数据框:pandas 很酷,可以理解您希望在分组的键中广播这些项目,但它将数据框的索引作为附加级别来保证相干输出数据。因此,在处理结束时显式地降低 level=-1 是预期的。

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

关于python - 为什么在 Pandas 中使用 apply 时会有一个额外的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42124172/

相关文章:

python - 在附加条件下与 pd.NamedAgg 聚合

python - Pandas 专栏: applying a function

python - 以正确的顺序从数组构建 block 矩阵

python - Django,drf-yasg - 如何向标签添加描述?

java - 映射任务中长正则表达式的最佳选择是什么?

python - 如何将 pandas 数据帧的对象值转换为小时数?

python - 根据同一行其他列中的值将函数应用于数据框列元素?

r - 计算 df 中每个元素的百分比值(基于最大值);但是在指定的列中

lisp - 为什么函数应用会提示长列表?

python - regEx:匹配两组字符