Python 熊猫vs Numpy索引:为什么索引的顺序会有这种根本性的差异?

Python 熊猫vs Numpy索引:为什么索引的顺序会有这种根本性的差异?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,Numpy: 将numpy导入为np nparr=np.array([[1,5],[2,6],[3,7]] 打印(nparr) 打印(nparr[0])#首先选择行 打印(nparr[0][1])#然后选择列 按预期提供输出: [[1 5] [2 6] [3 7]] [1 5] 5 熊猫: df=pd.DataFrame({ “a”:[1,2,3], ‘b’:[5,6,7] }) 打印(df) 打印(df['a'])#首先选择列!!! 打印(df['a'][1])#然后选择行!!!

Numpy:

将numpy导入为np
nparr=np.array([[1,5],[2,6],[3,7]]
打印(nparr)
打印(nparr[0])#首先选择行
打印(nparr[0][1])#然后选择列
按预期提供输出:

[[1 5]
 [2 6]
 [3 7]]

[1 5]

5
熊猫:

df=pd.DataFrame({
“a”:[1,2,3],
‘b’:[5,6,7]
})
打印(df)
打印(df['a'])#首先选择列!!!
打印(df['a'][1])#然后选择行!!!
提供以下输出:

   a  b
0  1  5
1  2  6
2  3  7

0    1
1    2
2    3
Name: a, dtype: int64

2
将dataframe中“索引”的默认顺序更改为列优先的根本原因是什么?我们失去一致性/直觉的好处是什么

当然,如果我使用
iloc
函数,我们可以对其进行类似于Numpy数组索引的编码:

打印(df)
打印(df.iloc[0])#首先选择行
打印(df.iloc[0][1])#然后选择列

因为Numpy的直觉是数学(更具体地说是矩阵,类似于MATLAB),而Pandas的直觉是数据库(类似于SQL)。Numpy按行和列(行在前,因为矩阵的元素
(i,j)
表示
i
th行和
j
th列),而Pandas基于数据库的列工作,在数据库中选择元素,即行。当然,您可以使用
iloc
直接处理索引,如您所述


希望两者在范式/哲学上的差异是有意义的。

numpy
索引是多维的
pandas
是面向表格的,仅为2d(多索引变体除外)

您的
nparr[0][1]
更习惯地写为
nparr[0,1]

此索引可推广到3d(及更高版本):

它还可以推广到1d(这将类似于为列表编制索引),甚至是0d

如果从该数组生成数据帧,则帧的数据或值就是数组本身:

In [52]: df = pd.DataFrame(nparr)                                               
In [53]: df                                                                     
Out[53]: 
   0  1
0  1  5
1  2  6
2  3  7
In [54]: df._values                                                             
Out[54]: 
array([[1, 5],
       [2, 6],
       [3, 7]])
如果我修改数组的一个元素,我们也会看到帧中的更改:

In [56]: nparr[0,1] *=100                                                       
In [57]: nparr                                                                  
Out[57]: 
array([[  1, 500],
       [  2,   6],
       [  3,   7]])
In [58]: df                                                                     
Out[58]: 
   0    1
0  1  500
1  2    6
2  3    7

In [61]: df[1]          # a Series                                                        
Out[61]: 
0    500
1      6
2      7
Name: 1, dtype: int64
pandas
已将自己的索引层(包括列和行标签)添加到基础数组中。它将以某种方式将其索引输入映射到数组的


由于有其他方法构造数据帧,因此帧和数组之间并不总是一对一匹配。

great answer+1我认为数据帧是由系列组成的。系列/列在
d类型中可能有所不同
numpy
具有结构化数组,字段具有自己的数据类型。虽然我非常感谢您回答中的许多信息,但我无法理解这是如何解决我的问题的。可能是我没有正确理解答案所在的那一行。这句话的答案是:由于构造数据帧还有其他方法,所以帧和数组之间并不总是一对一的匹配?我的主要意图是说明
numpy
行/列顺序只是其通用多维索引的一个实例
pandas
Designer出于什么原因选择了系列/列方向,即使底层数据结构是numpy数组,他们也会使用该方向。我们大多数人只能通过辨别模式来回答为什么,而不是通过阅读设计师的意图。谢谢。您的回答也帮助我更好地理解了这一点,特别是您首先显示使用字段名索引的numpy数组的部分,类似于pandas,提供了类似于pandas系列的列输出。
In [48]: arr = np.arange(24).reshape(2,3,4)                                     
In [49]: arr                                                                    
Out[49]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
In [50]: arr[1,1,:]                                                             
Out[50]: array([16, 17, 18, 19])
In [52]: df = pd.DataFrame(nparr)                                               
In [53]: df                                                                     
Out[53]: 
   0  1
0  1  5
1  2  6
2  3  7
In [54]: df._values                                                             
Out[54]: 
array([[1, 5],
       [2, 6],
       [3, 7]])
In [56]: nparr[0,1] *=100                                                       
In [57]: nparr                                                                  
Out[57]: 
array([[  1, 500],
       [  2,   6],
       [  3,   7]])
In [58]: df                                                                     
Out[58]: 
   0    1
0  1  500
1  2    6
2  3    7

In [61]: df[1]          # a Series                                                        
Out[61]: 
0    500
1      6
2      7
Name: 1, dtype: int64