Python 3.4和Pandas 0.15.0
df是一个数据框,col1是一列。使用下面的代码,我检查是否存在值10并将此值替换为1000.
df.col1[df.col1 == 10] = 1000
这是另一个例子。这次,我根据索引更改了col2中的值。
df.col2[df.index == 151] = 500
这两个都会产生以下警告:
-c:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
最后,
cols = ['col1', 'col2', 'col3']
df[cols] = df[cols].applymap(some_function)
这会产生类似的警告,并附加建议:
Try using .loc[row_indexer,col_indexer] = value instead
我不确定我是否理解警告中指出的讨论。编写这三行代码的更好方法是什么?
请注意,这些操作有效。
答案 0 :(得分:39)
这里的问题是:df.col1[df.col1 == 10]
会返回一份副本。
所以我会说:
row_index = df.col1 == 10
# then with the form .loc[row_indexer,col_indexer]
df.loc[row_index, 'col1'] = 100
答案 1 :(得分:5)
同意保罗关于'loc'的使用。
对于您的applymap案例,您应该能够这样做:
cols = ['col1', 'col2', 'col3']
df.loc[:, cols] = df[cols].applymap(some_function)