为什么在 Pandas 中使用 apply 时会有一个额外的索引
Why there is an extra index when using apply in Pandas
当我对 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 是预期的。
如果你想避免重置那个额外的索引,但仍然有一些 post 处理,另一种方法是调用转换而不是应用,并从 fnc
获取返回的数据您放置 np.nan
以排除结果的整个组向量。然后,您的数据框将不会有额外的级别,但之后您需要调用 dropna()
。
当我对 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 是预期的。
如果你想避免重置那个额外的索引,但仍然有一些 post 处理,另一种方法是调用转换而不是应用,并从 fnc
获取返回的数据您放置 np.nan
以排除结果的整个组向量。然后,您的数据框将不会有额外的级别,但之后您需要调用 dropna()
。