2016-01-05 2 views
2

Задача упрощается:SettingWithCopyWarning при использовании .loc

Мне нужно извлечь и изменить отдельные строки в DataFrame основе, имеет ли текст в колонке с «-» характер. Тире и все, что нужно, нужно удалить, а оставшийся текст должен быть тем, что было перед «-».

have: 
    textcol 
0 no dash here 
1 one - here 

want: 
    textcol 
0 one 

вот код, используемый для воссоздания моего сценария.

df = pd.DataFrame(data=['no dash here', 'one - here'], index=[0, 1], columns=['textcol']) 
df2 = df[df['textcol'].str.contains('-') == True] 
df2.loc[:, ['textcol']] = df2['textcol'].str.split('-').str[0] 

Полученные DataFrame df2 дает результат, что я желаю, с одним исключением. Каждый раз, когда я называю df2 (или любое производное после этого) я получаю следующее SettingWithCopyWarning:

A value is trying to be set on a copy of a slice from a DataFrame 
See the caveats in the documentation: 
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

Я пытался сделать то, что я хотел по-другому, и был дан подобную ошибку, что поручил мне, чтобы попытаться использовать .loc() вместо этого, но я все еще получаю эту аналогичную ошибку.

Есть ли лучший способ избежать ошибок, чтобы я мог достичь этого результата? Я боюсь, что здесь что-то происходит, что я не понимаю и что в конечном итоге df2 не приведет к тому, что я хочу. Мне также интересно, будет ли что-то вроде .query() работать.

+0

Вы получили представление/копию, когда вы назначили 'df2', который хотите работать непосредственно на df:' df.loc [df ['textcol']. Str.contains ('-'), 'textcol '] = df [' textcol ']. str.split (' - '). str [0] 'Я думаю, должен работать – EdChum

+0

@EdChum, я все равно получаю ту же ошибку :( – Lisle

ответ

4

Как указано @EdChum, df2 является view по адресу df, в отличие от copy. Если вы хотите copy, вы можете использовать .copy()(see docs) и SettingWithCopyWarning исчезает:

df2 = df[df['textcol'].str.contains('-') == True].copy() 
df2.loc[:, ['textcol']] = df2['textcol'].str.split('-').str[0] 

См returning a view vs copy в pandas документации.

Смежные вопросы