2017-05-07 281 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