Python 熊猫vs Numpy索引:为什么索引的顺序会有这种根本性的差异?
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导入为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