Pandas xs什么时候掉落尺寸?我怎么能强迫它到/不?

时间:2014-02-27 11:31:56

标签: python pandas

有时我会看到xs会从DataFrame返回一个Series,如果返回只有一行,有时则不然。如何强制执行它/不会发生? (可能与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的边界甚至不一致,可能是由于指数中的独特值的数量。

但是,结果是系列还是数据框取决于if get_loc返回0还是Slice(0,1,None)

此外,如果密钥不在索引中,get_loc有时会抛出KeyError异常,有时会返回Slice(0,0,None)

提交错误报告。 https://github.com/pydata/pandas/issues/6501

1 个答案:

答案 0 :(得分:0)

好的,它们都是定义的行为。所以我有责任处理它。