2017-05-07 235 views
6

看的这几行代码:大熊猫与numpy的Dataframes

df2 = df.copy() 
df2[1:] = df[1:]/df[:-1].values -1 
df2.ix[0, :] = 0 

我们的教官说,我们需要使用.values属性来访问基础numpy的阵列,否则,我们的代码不会工作。

我知道一个熊猫DataFrame的底层表现形式是一个numpy数组,但我不明白为什么我们不能直接在使用分片的熊猫DataFrame上操作。

请问您能否解释一下?

回答

7

熊猫专注于表格数据结构,并且在执行操作(加法,减法等)时,它会查看标签 - 而不是位置。

考虑下面的数据框:

df = pd.DataFrame(np.random.randn(5, 3), index=list('abcde'), columns=list('xyz')) 

这里,df[1:]是:

df[1:] 
Out: 
      x   y   z 
b 1.003035 0.172960 1.160033 
c 0.117608 -1.114294 -0.557413 
d -1.312315 1.171520 -1.034012 
e -0.380719 -0.422896 1.073535 

而且df[:-1]是:

df[:-1] 
Out: 
      x   y   z 
a 1.367916 1.087607 -0.625777 
b 1.003035 0.172960 1.160033 
c 0.117608 -1.114294 -0.557413 
d -1.312315 1.171520 -1.034012 

如果你这样做df[1:]/df[:-1]将分排b的按行b's,r行c的行c和行d的行d的。对于a行和e,它将不能够找到在其他数据框对应的行(在第一个或第二个),所以它会返回nan

df[1:]/df[:-1] 
Out: 
    x y z 
a NaN NaN NaN 
b 1.0 1.0 1.0 
c 1.0 1.0 1.0 
d 1.0 1.0 1.0 
e NaN NaN NaN 

如果你只想做以元素为单位的划分忽略标签,通过.values访问其中一个框架的底层numpy数组是一种告诉大熊猫忽略标签的方法。由于numpy阵列没有标签,熊猫只会做元素操作:

df[1:]/df[:-1].values 
Out: 
      x   y   z 
b 0.733258 0.159028 -1.853749 
c 0.117252 -6.442482 -0.480515 
d -11.158359 -1.051357 1.855018 
e 0.290112 -0.360981 -1.038223 
+0

现在,我明白最后的结果会是一样的,但我想知道它是否会更正式地正确对分子也使用numpy数组。 – MadHatter

+1

在这种情况下,整个操作将会是numpy,所以它会返回一个没有标签的数组。请注意,在最终输出('df [1:]/df [: - 1] .values')中,结果是一个DataFrame。所以它将根据您的需求。 – ayhan