2017-05-17 1 views
1

私はpandasを新しくしました。データフレームがあれば、特定の要件を満たさない列をいくつか削除しようとしていました。それを行う方法を研究し、私はこのような構造になった:フレームを処理するときにDataFrameからスライスのコピーに値を設定しようとしています。 - 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 
+0

あなたのコードはOKと思われるが、私は問題は前だと思う - [-ビュー対コピーを返す]チェック(http://pandas.pydata.org/pandas-docs/stable/ – jezrael

+1

は、 'df = df.loc [df ['DS_FAMILIA_PROD']。isin(['CARTOES'、 'C​​ARTÕES'])]'行を削除することはありません''DS_FAMILIA_PROD''列の値に基づいて、列を削除しないでください。 –

答えて

2

後でdf内の値を変更した場合、あなたが見つけるためにあなたは、copyを必要とします変更が元のデータ(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 
1
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 
2

警告の目的は、彼らがコピー上で動作し、オリジナルではないことができることをユーザーに示すことであるが、偽陽性があることができます。コメントの中で述べたように、これはあなたのユースケースの問題ではありません。

あなたは単にあなたのデータフレームのチェックオフにすることができます:

df.is_copy = False 

をしたり、明示的にコピーすることができます。

df = df.loc[df['DS_FAMILIA_PROD'].isin(['CARTOES', 'CARTÕES'])].copy() 
関連する問題