Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python pandas removing SettingWithCopyWarning

So I made an empty dataframe using

df=data[['ID','Matrix','Name','Country', 'Units']]
df['Value']=''

and I am filling it in with code like this, which finds strings containing values of 'Good', 'Bad' in df.Matrix and filling them with values in sch[i]:

df.loc[df.Matrix.str.contains('Good'),'Value'] = sch[2]
df.loc[df.Matrix.str.contains('Bad'),'Value'] = sch[6]
df.loc[df.Matrix.str.contains('Excellent'),'Value'] = sch[8]

I have been getting a bunch of errors like both of these two different ones:

C:\Python33\lib\site-packages\pandas\core\strings.py:184: UserWarning: This pattern has match groups. To actually get the groups, use str.extract.
  " groups, use str.extract.", UserWarning)

C:\Users\0\Desktop\python\Sorter.py:57: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
  df.loc[df.Matrix.str.contains('Bad'),'Value'] = sch[6]

So far I am suppressing the code using

pd.options.mode.chained_assignment = None

If I do not suppress the error messages I will get about 20 of them. Is there another format I can change the data so that I do not get the error message?

I am using python 3 and pandas 0.131 if it helps

like image 937
user3084006 Avatar asked Feb 04 '14 18:02

user3084006


People also ask

How do I turn off auto index in pandas?

The most straightforward way to drop a Pandas dataframe index is to use the Pandas . reset_index() method. By default, the method will only reset the index, forcing values from 0 - len(df)-1 as the index.

How do I get rid of copy warning settings?

Each DataFrame has an is_copy property that is None by default but uses a weakref to reference the source DataFrame if it's a copy. By setting is_copy to None , you can avoid generating a warning.

How do you get rid of trailing spaces in pandas?

Pandas provide predefine method “pandas. Series. str. strip()” to remove the whitespace from the string.

How do I remove a prefix from pandas?

To remove prefix from column labels in Pandas DataFrame, use the str. lstrip(~) method.


1 Answers

Here is a good explanation of why this warning was turned on:

Pandas: Chained assignments

Are you sure that is all of your code? Pls show all of what you are doing.

In [13]: df = DataFrame(index=range(5))

In [14]: df['Value'] = ''

In [15]: df.loc[[1,4],'Value'] = 'bad'

In [16]: df.loc[[0,3],'Value'] = 'good'

In [17]: df
Out[17]: 
  Value
0  good
1   bad
2      
3  good
4   bad

[5 rows x 1 columns]

2nd example

In [1]: df = DataFrame(index=range(5))

In [2]: df['Value'] = ''

In [3]: df2 = DataFrame(dict(A=['foo','foo','bar','bar','bah']))

In [4]: df
Out[4]: 
  Value
0      
1      
2      
3      
4      

[5 rows x 1 columns]

In [5]: df2
Out[5]: 
     A
0  foo
1  foo
2  bar
3  bar
4  bah

[5 rows x 1 columns]

In [6]: df.loc[df2.A.str.contains('foo'),'Value'] = 'good'

In [7]: df.loc[df2.A.str.contains('bar'),'Value'] = 'bad'

In [8]: df
Out[8]: 
  Value
0  good
1  good
2   bad
3   bad
4      

[5 rows x 1 columns]
like image 68
Jeff Avatar answered Oct 14 '22 17:10

Jeff