簡體   English   中英

試圖在 DataFrame 的切片副本上設置一個值。- pandas

[英]A value is trying to be set on a copy of a slice from a DataFrame. - pandas

我是pandas的新手,並且在給定數據框的情況下,我試圖刪除一些未滿足特定要求的列。 研究如何去做,我得到了這個結構:

df = df.loc[df['DS_FAMILIA_PROD'].isin(['CARTOES', 'CARTÕES'])]

但是,在處理框架時,出現此錯誤:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self[name] = value

我不確定該怎么做,因為我已經在使用.loc function。我錯過了什么?

f = ['ID_manifest', 'issue_date', 'channel', 'product', 'ID_client', 'desc_manifest']

df = pd.DataFrame(columns=f)
for chunk in df2017_chunks:
    aux = preProcess(chunk, f)
    df = pd.concat([df, aux])

def preProcess(df, f):    
    stops = list(stopwords.words("portuguese"))
    stops.extend(['reclama', 'cliente', 'santander', 'cartao', 'cartão'])

    df = df.loc[df['DS_FAMILIA_PROD'].isin(['CARTOES', 'CARTÕES'])]

    df.columns = f
    df.desc_manifest = df.desc_manifest.str.lower() # All lower case
    df.desc_manifest = df.desc_manifest.apply(lambda x: re.sub('[^A-zÀ-ÿ]', ' ', str(x))) # Just letters
    df.replace(['NaN', 'nan'], np.nan, inplace = True) # Remone nan
    df.dropna(subset=['desc_manifest'], inplace=True)
    df.desc_manifest = df.desc_manifest.apply(lambda x: [word for word in str(x).split() if word not in stops]) # Remove stop words

    return df

警告的目的是向用戶表明他們可能正在操作副本而不是原件,但可能存在誤報。 正如評論中提到的,這對您的用例來說不是問題。

您可以簡單地關閉對數據框的檢查:

df.is_copy = False

或者您可以明確復制:

df = df.loc[df['DS_FAMILIA_PROD'].isin(['CARTOES', 'CARTÕES'])].copy()

您需要copy ,因為如果您稍后修改df值,您會發現修改不會傳播回原始數據( df ),並且 Pandas 會發出警告。

loc可以省略,但警告也可以不copy

df = pd.DataFrame({'DS_FAMILIA_PROD':['a','d','b'],
                   'desc_manifest':['F','rR', 'H'],
                   'C':[7,8,9]})

def preProcess(df):    
    df = df[df['DS_FAMILIA_PROD'].isin([u'a', u'b'])].copy()
    df.desc_manifest = df.desc_manifest.str.lower() # All
    ...
    ...
    return df


print (preProcess(df))
   C DS_FAMILIA_PROD desc_manifest
0  7               a             f
2  9               b             h

如果您的程序打算故意獲取 df 的副本,您可以通過以下方式停止警告:

pd.set_option('mode.chained_assignment', None)
pd.set_option('mode.chained_assignment', 'warn')
# if you set a value on a copy, warning will show

df = DataFrame({'DS_FAMILIA_PROD' : [1, 2, 3], 'COL2' : [5, 6, 7]})
df = df[df.DS_FAMILIA_PROD.isin([1, 2])]
df
Out[29]: 
   COL2  DS_FAMILIA_PROD
0     5                1
1     6                2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM