【发布时间】:2014-02-27 11:31:56
【问题描述】:
有时我看到xs 会从 DataFrame 返回一个系列,如果返回只有一行,有时不是。如何强制它发生/不发生? (可能与Why pandas xs doesn't drop levels even if drop_level = True有关)
df = pd.DataFrame({'a':np.append(np.random.randint(0,10,10000), -1),
'b':np.append(np.random.randint(0,10,10000), -1),
'c':np.append(np.random.randint(0,10,10000), -1),
'value':np.random.randint(0,100,10001)})
df.set_index(['a','b','c'], inplace=True)
df.sortlevel(inplace = True)
df.xs((-1,-1,-1), drop_level=True)
value
a b c
-1 -1 -1 43
这里它返回一个单行数据框而不是一个系列。
df2 = pd.DataFrame({'a':['a1','a2','a3'],
'b':['b1','b1','b1'],
'c':[1,1,1],
'value':np.random.randint(0,100,3)})
df2.set_index(['a','b','c'], inplace=True)
df2.sortlevel(inplace = True)
df2.xs(('a1','b1',1))
value 30
Name: (a1, b1, 1), dtype: int64
在这种情况下,仅返回 Series。
更新
我的同事刚刚发现,如果df的长度很大,它会返回一个数据框,否则它会返回一个系列。
n=25
df = pd.DataFrame({'a':np.append(np.random.randint(0,10,n), -1),
'b':np.append(np.random.randint(0,10,n), -1),
'c':np.append(np.random.randint(0,10,n), -1),
'value':np.random.randint(0,100,n+1)})
df.set_index(['a','b','c'], inplace=True)
df.sortlevel(inplace = True)
display(df.xs((-1,-1,-1), drop_level=True))
df.index.get_loc((-1,-1,-1))
n 的边界甚至不一致,这可能是由于索引中不同值的数量。
但是,结果是 Series 还是 Data Frame 取决于 get_loc 返回 0 还是 Slice(0,1,None)
更重要的是,如果键不在索引中,get_loc 有时会抛出 KeyError 异常,有时会返回 Slice(0,0,None)。
【问题讨论】:
-
可能是bug,请在github上提交报告
-
我提交了,但它被关闭了。在 github 上提出问题似乎没有意义。
-
您提交的问题与 drop level 无法使用完全指定的索引器的问题完全不同 - 这可能是一个错误 - 您提交的不是
-
我关闭了你的问题,因为你还没有解释你实际上在做什么 -