2017-05-17 2 views
1

저는 pandas을 처음 접했고 데이터 프레임이 주어지면서 특정 요구 사항을 충족시키지 못하는 열을 일부 삭제하려고했습니다.값이 DataFrame에서 슬라이스 복사본에 설정하려고합니다. - pandas

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 

내가 '때문에 수행 할 작업에 대한 확실하지 않다 : 프레임을 처리 할 때

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

그러나, 나는이 오류가 발생합니다 : 그것을 수행하는 방법을 검토 한 결과, 나는이 구조에 도착 이미 .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 것 같다,하지만 난 문제가 전에 생각 - [돌아-A-보기 - 대 - 한 - 복사] 체크 (http://pandas.pydata.org/pandas-docs/stable/를 indexing.html # returning-a-view-a-copy) – jezrael

+1

은'df = df.loc [df [ 'DS_FAMILIA_PROD'] .isin ([CARTOES ','CARTENTS '])]'행을 삭제하지 않습니다. DS_FAMILIA_PROD' 열의 값을 기반으로 열을 삭제하지 않습니까? –

답변

2

당신은 나중에 발견 할 것이다, copy 필요 수정 사항이 원래 데이터 (df)로 다시 전파되지 않으며 팬더가 경고를합니다.

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 

또는 명시 적으로 복사 할 수 있습니다 :

당신은 단순히 당신의 dataframe의 체크를 해제 할 수 있습니다 당신이 df 값을 수정하는 경우 때문에

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