鉴于此数据框:
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
有没有办法考虑这种差异,而不是"它只是它的方式"?
答案 0 :(得分:0)
我的理解是,这复制了R的行为,以便更容易迁移R脚本,它也从不推荐使用的ix
开始。有一个很多的方法可以进行切片,但现在我们有更少的切片:
我个人喜欢将__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
中存在潜在的歧义(以及性能问题 - 还有很多可能的路径)。因此,除了消除歧义之外,迁移到loc
和iloc
也会带来更快的代码(如果可以的话,通常会使用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']]
尽管他们选择了看似合理的行为,但“事情就是这样”。此外,似乎没有关于 []
索引运算符的明确文档 - 至少会有所帮助。