gpt4 book ai didi

python - 为什么 Pandas DataFrame 的 [] (__getitem__) 有时选择列,有时选择行?

转载 作者:行者123 更新时间:2023-12-03 17:36:30 24 4
gpt4 key购买 nike

鉴于此数据框:

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

但是如果我将 bool 值列表传递给 [] ,它将过滤行:
In [45]: df[[True, False]]
Out[45]:
A B C
0 1 2 3

有没有办法考虑这种差异,而不是“它就是这样”?

最佳答案

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

  • 单个项目,得到一列。
  • 列列表,获取“子帧”
  • bool 索引

  • 我个人喜欢用 __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

    值得注意的是, bool 掩码并不含糊,除非您有一个深奥的示例,其中 bool 列和输入长度与 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 如果可以的话,它是最快的)。

    关于python - 为什么 Pandas DataFrame 的 [] (__getitem__) 有时选择列,有时选择行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254954/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com