2014-04-25 32 views
51

熊貓在決定從數據框中選擇原始數據框或原始數據視圖的副本時,會使用Panda規則。Pandas使用什麼規則來生成視圖和副本?

如果我有,例如,

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9)) 

我明白,一個query返回一個副本,以便像

foo = df.query('2 < index <= 5') 
foo.loc[:,'E'] = 40 

將對原有數據幀,df沒有影響。我也明白,標或命名切片返回一個視圖,使分配到這些,比如

df.iloc[3] = 70 

df.ix[1,'B':'E'] = 222 

將改變df。但是當涉及到更復雜的案例時,我迷失了方向。例如,

df[df.C <= df.B] = 7654321 

改變df,但

df[df.C <= df.B].ix[:,'B':'E'] 

沒有。

有一個簡單的規則,熊貓正在使用,我只是失蹤?這些具體情況發生了什麼?特別是,如何在滿足特定查詢的數據框中更改所有值(或值的子集)(如我在上面的示例中試圖做的那樣)?


注意:這與this question不一樣;我讀過the documentation,但我沒有受到啓發。我也讀過關於這個主題的「相關」問題,但我仍然想念熊貓正在使用的簡單規則,以及我將如何應用它 - 例如 - 修改值(或值的子集)在滿足特定查詢的數據框中。

回答

51

這裏的規則,隨後覆蓋:

  • 所有操作產生的副本

  • 如果提供inplace=True,它會修改就地;只有一些操作支持這種設置,例如設置一個索引器。 .loc/.ix/.iloc/.iat/.at將設置在原地。

  • 獲取單個dtyped對象的索引器幾乎總是一個視圖(取決於內存佈局,它可能不是這就是爲什麼這不可靠)。這主要是爲了提高效率。 (從上面的例子是用於.query;這將總是返回副本由numexpr其評價)

  • ,一個多dtyped對象上得到一個索引始終是一個拷貝。

你的chained indexing

df[df.C <= df.B].ix[:,'B':'E'] 

例子並不保證工作(因此你shoulld 從未做到這一點)。

而是做:

df.ix[df.C <= df.B, 'B':'E'] 

,因爲這是更快並始終工作

鏈接的索引是2個獨立的蟒蛇操作,因此無法通過熊貓可靠攔截(你會經常得到SettingWithCopyWarning,但那也不是100%可檢測的)。您指出的dev docs提供了更完整的解釋。

+0

這打開了我的眼睛道:「鏈接索引是2個獨立的蟒蛇操作,因此不能可靠*由大熊貓攔截......」這解釋了爲什麼事情似乎飄忽不定的我,爲什麼實驗是行不通的針腳東西下。 – orome

+1

關於第二和第五條規則(看看我是否理解):如果我設置了一些我已經索引的東西(例如'.loc')作爲任務的LHS,它將設置到位(第二條規則);但是在「兩個步驟」中使用相同表現形式的操作,一個是對變量賦值的RHS索引,另一個賦值給該變量不會改變原始數據,因爲第一個詞幹創建副本(第五個規則)。是對的嗎? – orome

+0

這就是我最後的(「從不做」)例子 - 第一個索引,[df.C <= df.B]'得到一個副本(第五條規則),而第二個'.ix [ :,'B':'E']',是(無關緊要,因爲第一次得到一份副本)設置(第二條規則)。 – orome

相關問題