Python 熊猫中双大括号“[…]”和单大括号“[…]”索引之间的差异

Python 熊猫中双大括号“[…]”和单大括号“[…]”索引之间的差异,python,pandas,syntax,Python,Pandas,Syntax,我对以下代码行的语法感到困惑: x_values = dataframe[['Brains']] dataframe对象由2列(大脑和身体)组成 当我打印x_值时,我得到如下结果: Brains 0 42 1 32 就dataframe对象的属性和方法而言,我知道pandas文档,但双括号语法让我感到困惑。考虑一下: 资料来源: In [79]: df Out[79]: Brains Bodies 0 42 34 1 32 23 选择一列

我对以下代码行的语法感到困惑:

x_values = dataframe[['Brains']]
dataframe对象由2列(大脑和身体)组成

当我打印x_值时,我得到如下结果:

Brains
0  42
1  32
就dataframe对象的属性和方法而言,我知道pandas文档,但双括号语法让我感到困惑。

考虑一下:

资料来源:

In [79]: df
Out[79]:
   Brains  Bodies
0      42      34
1      32      23
选择一列-结果为熊猫。系列:

In [80]: df['Brains']
Out[80]:
0    42
1    32
Name: Brains, dtype: int64

In [81]: type(df['Brains'])
Out[81]: pandas.core.series.Series
选择DataFrame的子集-生成DataFrame:

In [82]: df[['Brains']]
Out[82]:
   Brains
0      42
1      32

In [83]: type(df[['Brains']])
Out[83]: pandas.core.frame.DataFrame
结论:第二种方法允许我们从数据帧中选择多个列。第一个仅用于选择单个列

演示:

如果我们在列表中只指定一列,我们将得到一个包含一列的数据帧:

In [87]: df[['e']]
Out[87]:
          e
0  0.487693
1  0.117029
2  0.946373
3  0.907163
4  0.012626

Python中没有针对
[[
]
的特殊语法。而是创建一个列表,然后将该列表作为参数传递给DataFrame索引函数

根据@MaxU的回答,如果将单个字符串传递给数据帧,则返回表示该列的序列。如果传递字符串列表,则返回包含给定列的数据帧

因此,当您执行以下操作时

# Print "Brains" column as Series
print(df['Brains'])
# Return a DataFrame with only one column called "Brains"
print(df[['Brains']])
# Print "Brains" column as Series
column_to_get = 'Brains'
print(df[column_to_get])
# Return a DataFrame with only one column called "Brains"
subset_of_columns_to_get = ['Brains']
print(df[subset_of_columns_to_get])
它相当于以下内容

# Print "Brains" column as Series
print(df['Brains'])
# Return a DataFrame with only one column called "Brains"
print(df[['Brains']])
# Print "Brains" column as Series
column_to_get = 'Brains'
print(df[column_to_get])
# Return a DataFrame with only one column called "Brains"
subset_of_columns_to_get = ['Brains']
print(df[subset_of_columns_to_get])
在这两种情况下,数据帧都使用
[]
运算符进行索引

Python使用
[]
操作符进行索引和构造列表文本,我相信这最终会让您感到困惑。
df[['Brains']
中的外部
[
]
正在执行索引,内部正在创建列表

>>> some_list = ['Brains']
>>> some_list_of_lists = [['Brains']]
>>> ['Brains'] == [['Brains']][0]
True
>>> 'Brains' == [['Brains']][0][0] == [['Brains'][0]][0]
True
我在上面说明的是,Python在任何时候都不会看到
[[
并对其进行专门解释。在上一个复杂的示例(
[['Brains'][0]][0]
)中,没有特殊的
][
操作符或
][
操作符……发生了什么

  • 创建单个元素列表(
    ['Brains']
  • 该列表的第一个元素被索引(
    ['Brains'][0]
    =>
    'Brains'
  • 被放入另一个列表(
    [['Brains'][0]]
    =>
    ['Brains']]
  • 然后该列表的第一个元素被索引(
    [[['Brains'][0]][0]
    =>
    'Brains'

其他解决方案展示了一个系列和一个数据框的区别。对于数学头脑来说,你可能希望考虑输入和输出的维度。

Object                                Series          DataFrame
Dimensions (obj.ndim)                      1                  2
Syntax arg dim                             0                  1
Syntax                             df['col']        df[['col']]
Max indexing dim                           1                  2
Label indexing              df['col'].loc[x]   df.loc[x, 'col']
Label indexing (scalar)      df['col'].at[x]    df.at[x, 'col']
Integer indexing           df['col'].iloc[x]  df.iloc[x, 'col']
Integer indexing (scalar)   df['col'].iat[x]   dfi.at[x, 'col']

当您为
pd.DataFrame.\uuuu getitem\uuuuu
指定标量或列表参数时,
[]
是语法糖,参数的维数比结果的维数小一个。因此标量(0维)给出一维序列。列表(1维)给出一个二维数据框。这是有意义的,因为附加维度是数据框索引,即行。即使数据框碰巧没有行,也是如此。

为了消除任何可能的混淆,第一种形式相当于
列='Brains';df[列]
,第二种形式相当于
子集=['Brains'];df[subset]
。第一个传递字符串,第二个传递列表。这不是使用
[[
]]
执行一种特殊形式的索引,但传递的对象是另一种类型。谢谢,这是有意义的。您知道双括号是Python语法还是特定于dataframe对象。我曾尝试查看数组和对象的Python语法,但找不到任何内容。@MikeFellner查看我的注释。它提供了准确的回答你的问题。我把这个评论作为一个答案,因为似乎有两件事让OP感到困惑。所以简单地说,如果索引是一个数组,它将返回带有匹配列的数据帧,否则它将返回带有单个匹配列的一个系列。这应该是公认的答案。我也对synt感到非常困惑ax.在理解了double
[[]]
只是两个
[]
之后,现在一切都变得有意义了。例如,
df[df['col']==val]
返回数据帧而不是序列,因为
df['col']==val
是一个系列,结果是一系列的系列,这是一个数据帧。是的,这个答案是最好的。它澄清了一些我(可能是大多数人)忽略的显而易见的事情。[['Brains']][0][0]访问字符串“Brains”中的“B”。[['Brains'][0][0]访问字符串“Brains”。[['Brains']]0]访问第一个字符串(且仅限于)从列表[['Brains']]的单元素列表中列出['Brains']]。如果这是一个多元素列表[['Brains']、['Body']、['Souls']],那么访问操作员可以钻取这三个列表中的任何一个。[['Brains']、['Bodys']、['Souls']][2][0][0]访问列表3中的“S”[['Brains']、['Bodyes']、['Souls']、['Souls'][0]=['Brains']。