2017-06-29 57 views
2

編輯: 一個簡單的錯誤/錯誤導致了一些不可解釋的問題。我編輯了這個問題,留下了實際可以解釋的部分,並且已經發布了答案。意外的熊貓廣播行爲


我在努力瞭解以下索引行爲: 假設我有一些pd.DataFrame

In [18]: Df = pd.DataFrame(zip(list('abcde'),sp.randn(5)),index=range(5),columns=['label','val']) 

In [19]: Df 
Out[19]: 
    label  val 
0  a -0.705392 
1  b 0.087682 
2  c 1.519180 
3  d 1.363852 
4  e -0.004182 

,我試圖通過他們的一個正常化的val所有值,說c。 直覺我會寫

Df['val']/Df.loc[Df['label'] == 'c']['val'] 

但結果這會觸發一些廣播的行爲我不完全理解:

In [20]: Df['val']/Df.loc[Df['label'] == 'c']['val'] 
Out[20]: 
0 NaN 
1 NaN 
2 1.0 
3 NaN 
4 NaN 
Name: val, dtype: float64 

爲什麼會出現這種情況?

+0

當我看到標題我首先想到的是爲您指出[HTTPS:/ /biology.stackexchange.com/](https://biology.stackexchange.com/)。 – MichaelB76

回答

3

你將一個SeriesSeries,這是造成大熊貓對指數保持一致。如果你看一下通過索引產生的價值:

df.loc[df['label'] == 'c']['val'] 
2 1.51918 
Name: val, dtype: float64 

...你會看到這是一個Series。如果進一步指數這個Series

df.loc[df['label'] == 'c']['val'][2] 
1.51918 

...我們現在只剩下:

type(df.loc[df['label'] == 'c']['val'][2]) 
<class 'numpy.float64'> 

如果我們試圖將整個val系列本:

df.val/df.loc[df['label'] == 'c']['val'][2] 
0 -0.464324 
1 0.057717 
2 1.000000 
3 0.897755 
4 -0.002753 
Name: val, dtype: float64 

...我們有預期的行爲。

請注意,這種凌亂的鏈接索引是不是你應該如何通過奇異值除以整體Series ...

+0

你可以推薦一種如何在'DataFrame' /'Series'中從另一個地方派生的奇異值來劃分'Series'的最佳方法嗎? –

+0

@grgrsr我認爲這實際上取決於數據集。例如,如果有兩個標籤=='c'的記錄呢?這種方法並不理想 –

+0

在這個特定的例子中,我確定'label == c'是唯一的,但我同意這是非常具體的。但是,我仍然無法看到通過凌亂的鏈索引或投射獲得浮點數的另一種方式。 –

0

[我想這裏發生的是,你不能直接通過其他系列劃分系列 - 通過/運營商。有一個pandas.Series.divide功能。] 編輯:顯然你可以和我啞。

如果轉換Df.loc[Df['label'] == 'c']['val']爲float你不會有任何問題,將一個系列的對象由它:

foo = float(Df.loc[Df['label'] == 'c']['val']) 
Df['val']/foo 
+0

所以在我的代碼中,我出現了這個問題,我完成了這個 - 獲得浮動,然後我繼續。但後來我有點好奇爲什麼會發生這種情況,特別是爲什麼第二行是唯一一個離開非'NNN'的原因,即使'Series'對象的索引是'0' –

+1

這完全是不正確的 –

+0

You絕對可以通過另一個'Series'來劃分'Series' ... –