【问题标题】:When does Pandas xs drop dimensions and how can I force it to/not to?Pandas xs 何时下降尺寸,我如何强制/不强制?
【发布时间】: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)

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

【问题讨论】:

  • 可能是bug,请在github上提交报告
  • 我提交了,但它被关闭了。在 github 上提出问题似乎没有意义。
  • 您提交的问题与 drop level 无法使用完全指定的索引器的问题完全不同 - 这可能是一个错误 - 您提交的不是
  • 我关闭了你的问题,因为你还没有解释你实际上在做什么 -

标签: python pandas


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多