有时我会看到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)
。
答案 0 :(得分:0)
好的,它们都是定义的行为。所以我有责任处理它。