为什么pandas DataFrame' s [](__ getitem__)有时会选择列,有时候是行?

时间:2017-11-12 22:59:00

标签: python pandas

鉴于此数据框:

In [40]: df = pd.DataFrame({'A': [1, 1], 'B': [2, 2], 'C': [3, 3]})

In [41]: df
Out[41]:
   A  B  C
0  1  2  3
1  1  2  3

如果我将字符串列表传递给[],它会过滤列:

In [42]: df[['A', 'C']]
Out[42]:
   A  C
0  1  3
1  1  3

但如果我将一个布尔值列表传递给[],它将过滤行:

In [45]: df[[True, False]]
Out[45]:
   A  B  C
0  1  2  3

有没有办法考虑这种差异,而不是"它只是它的方式"?

2 个答案:

答案 0 :(得分:0)

我的理解是,这复制了R的行为,以便更容易迁移R脚本,它也从不推荐使用的ix开始。有一个很多的方法可以进行切片,但现在我们有更少的切片:

  1. 单项,获取专栏。
  2. 列列表,获得"子帧"
  3. 布尔索引
  4. 我个人喜欢将__getitem__用于所有这些:

    In [11]: df[['A', 'C']]
    Out[11]:
       A  C
    0  1  3
    1  1  3
    
    In [12]: df['A']
    Out[12]:
    0    1
    1    1
    Name: A, dtype: int64
    

    替代方案虽然模糊性较低(loc(或iloc)但过于冗长:

    In [13]: df.loc[:, ['A', 'B']]
    Out[13]:
       A  B
    0  1  2
    1  1  2
    
    In [14]: df.loc[:, 'A']
    Out[14]:
    0    1
    1    1
    Name: A, dtype: int64
    

    值得注意的是,布尔掩码不明确,除非你有一个深奥的例子,其中布尔列和输入长度与DataFrame的匹配:

    In [21]: df1 = pd.DataFrame({True: [1, 2], False: [3, 4]})
    
    In [22]: df1
    Out[22]:
       False  True
    0      3      1
    1      4      2
    
    In [23]: df1[[True, False]]  # boolean slicing (not as column names)
    Out[23]:
       False  True
    0      3      1
    

    从历史上看,ix中存在潜在的歧义(以及性能问题 - 还有很多可能的路径)。因此,除了消除歧义之外,迁移到lociloc也会带来更快的代码(如果可以的话,通常会使用iloc。)

答案 1 :(得分:0)

Indexing and selecting data 文档提到 [] 运算符的提供更多是为了方便。所以它是否适用于行或列似乎是基于什么被认为是常见的操作。

<块引用>

Python 和 NumPy 索引运算符 [] 和属性运算符 . 可让您快速轻松地访问各种用例中的 Pandas 数据结构。这使得交互式工作变得直观,因为如果您已经知道如何处理 Python 字典和 NumPy 数组,那么几乎没有什么新东西需要学习。但是,由于要访问的数据类型事先未知,因此直接使用标准运算符有一些优化限制。对于生产代码,我们建议您利用本章中公开的优化的 Pandas 数据访问方法。

<块引用>

使用 DataFrame,在 [] 内部切片会切片行。这主要是为了方便,因为它是如此常见的操作。

<块引用>

您可以使用与 DataFrame 索引长度相同的布尔向量从 DataFrame 中选择行。

<块引用>

由于使用 [] 进行索引必须处理很多情况(单标签访问、切片、布尔索引等),因此它有一些开销来确定您的要求。

到目前为止,我发现的是:

选择行

  • 布尔索引df[[True, False]]
  • 切片df[0:1]

选择列

  • 单标签df['A']
  • 标签列表df[['A', 'C']]

尽管他们选择了看似合理的行为,但“事情就是这样”。此外,似乎没有关于 [] 索引运算符的明确文档 - 至少会有所帮助。