2016-10-04 40 views
0

我有一個從函數返回的熊貓DataFramedf我通常不知道它是一個獨立的對象還是另一個DataFrame上的視圖。我想添加新的列,但不想不必要地複製它。修改可能是視圖的熊貓數據幀

df['new_column'] = 0 

,可以讓我們修改一份

df = df.copy() 

可能是昂貴的,如果DF大一個討厭的警告。 這裏最好的方法是什麼?

+0

df ['new_column'] = 0不應該引發警告imo,也許你在那之前做了一個df的副本? –

+0

s = pd.DataFrame({'a':[1,2],'b':[2,3]}) s1 = s [sa> 1] s1 ['c'] = 0 s1 ['c'] = 0 C:\ Anaconda3 \ lib \ site-packages \ ipykernel \ __ main__.py:1:SettingWithCopyWarning: 正嘗試在DataFrame的切片副本上設置一個值。 嘗試使用.loc [row_indexer,col_indexer] =值代替 請參閱文檔中的注意事項:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 如果__name__ =='__main__': – BlindDriver

+0

's1 = s [sa> 1]'是您創建問題的地方 –

回答

0

你應該使用一個索引來創建S1這樣有:

import pandas as pd 
s = pd.DataFrame({'a':[1,2], 'b':[2,3]}) 
indexer = s[s.a > 1].index 
s1 = s.loc[indexer, :] 
s1['c'] = 0 

應刪除警告。

+0

使用列表索引總是會創建一個副本,但這不是我的問題所在。我是_given_一個DataFrame,可能是也可能不是一個視圖。我想添加一個新的列(如果框架是一個視圖,那麼顯然,我需要創建一個副本;但是如果它不是一個視圖,那麼我不想複製它。) – BlindDriver

+0

[閱讀此](http ://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy) –