我有一個從函數返回的熊貓DataFrame
df
我通常不知道它是一個獨立的對象還是另一個DataFrame
上的視圖。我想添加新的列,但不想不必要地複製它。修改可能是視圖的熊貓數據幀
df['new_column'] = 0
,可以讓我們修改一份
df = df.copy()
可能是昂貴的,如果DF大一個討厭的警告。 這裏最好的方法是什麼?
我有一個從函數返回的熊貓DataFrame
df
我通常不知道它是一個獨立的對象還是另一個DataFrame
上的視圖。我想添加新的列,但不想不必要地複製它。修改可能是視圖的熊貓數據幀
df['new_column'] = 0
,可以讓我們修改一份
df = df.copy()
可能是昂貴的,如果DF大一個討厭的警告。 這裏最好的方法是什麼?
你應該使用一個索引來創建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
應刪除警告。
使用列表索引總是會創建一個副本,但這不是我的問題所在。我是_given_一個DataFrame,可能是也可能不是一個視圖。我想添加一個新的列(如果框架是一個視圖,那麼顯然,我需要創建一個副本;但是如果它不是一個視圖,那麼我不想複製它。) – BlindDriver
[閱讀此](http ://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy) –
df ['new_column'] = 0不應該引發警告imo,也許你在那之前做了一個df的副本? –
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
's1 = s [sa> 1]'是您創建問題的地方 –