我正在尝试将数据框的整个列设置为特定值。
In [1]: df
Out [1]:
issueid industry
0 001 xxx
1 002 xxx
2 003 xxx
3 004 xxx
4 005 xxx
从我所看到的,loc
替换数据框中的值时的最佳实践是(不是吗?):
In [2]: df.loc[:,'industry'] = 'yyy'
但是,我仍然收到这么多被谈论的警告消息:
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
如果我做
In [3]: df['industry'] = 'yyy'
我收到了同样的警告消息。
有任何想法吗?使用Python 3.5.2和pandas 0.18.1。
从现有对象定义新对象时,Python可能会发生意外的事情。您在上面的评论中指出,您的数据框是沿着定义的df = df_all.loc[df_all['issueid']==specific_id,:]
。在这种情况下,df
实际上只是存储在df_all
对象中的行的替身:不会在内存中创建新对象。
为了完全避免这些问题,我经常不得不提醒自己使用该copy
模块,该模块显式强制将对象复制到内存中,以便在新对象上调用的方法不应用于源对象。我和您有同样的问题,请避免使用该deepcopy
函数。
就您而言,这应该摆脱警告消息:
from copy import deepcopy
df = deepcopy(df_all.loc[df_all['issueid']==specific_id,:])
df['industry'] = 'yyy'
编辑 :另请参阅下面的David M.精彩评论!
df = df_all.loc[df_all['issueid']==specific_id,:].copy()
df['industry'] = 'yyy'