["python","pandas","dataframe"]
Set value on an entire column of a pandas dataframe

I'm trying to set the entire column of a dataframe to a specific value. In [1]: df Out [1]: issueid industry 0 001 xxx 1 002 xxx 2 003 xxx 3 004 xxx 4 005 xxx From what I've seen, loc is the best practice when replacing values in a dataframe (or isn't it?): In [2]: df.loc[:,'industry'] = 'yyy' However, I still received this much talked-about warning message: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead If I do In [3]: df['industry'] = 'yyy' I got the same warning message. Any ideas? Working with Python 3.5.2 and pandas 0.18.1. EDIT Jan 2023: Given the volume of visits on this question, it's worth stating that my original question was really more about dataframe copy-versus-slice than "setting value to an entire column". On copy-versus-slice: My current understanding is that, in general, if you want to modify a subset of a dataframe after slicing, you should create the subset by .copy(). If you only want a view of the slice, no copy() needed. On setting value to an entire column: simply do df[col_name] = col_value
Python can do unexpected things when new objects are defined from existing ones. You stated in a comment above that your dataframe is defined along the lines of df = df_all.loc[df_all['issueid']==specific_id,:]. In this case, df is really just a stand-in for the rows stored in the df_all object: a new object is NOT created in memory. To avoid these issues altogether, I often have to remind myself to use the copy module, which explicitly forces objects to be copied in memory so that methods called on the new objects are not applied to the source object. I had the same problem as you, and avoided it using the deepcopy function. In your case, this should get rid of the warning message: from copy import deepcopy df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:]) df['industry'] = 'yyy' EDIT: Also see David M.'s excellent comment below! df = df_all.loc[df_all['issueid']==specific_id,:].copy() df['industry'] = 'yyy'