Skip to main content
 首页 » 编程设计

python之试图在 DataFrame 的切片副本上设置一个值。之Pandas

2025年05月04日24over140

我是 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 函数。 我错过了什么?

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 

请您参考如下方法:

你需要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