我想要做的是将pandas DataFrame的单个条目NaN值替换为单个字符串。这就是我所做的。
s = pd.DataFrame({'A':['S12','S1','E53',np.NaN], 'B':[1,2,3,4]})
s['A'][s['A'].isnull()==True] = 'P'
此代码将尝试在DataFrame中查找“NaN”值,并将其替换为字符串“P”,结果如下所示。
A B
0 S12 1
1 S1 2
2 E53 3
3 P 4
但我也会收到这样的警告:
/Users/grr/anaconda/bin/ipython:3: 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
# -*- coding: utf-8 -*-
有人可以向我解释这意味着什么以及我应该做些什么来避免这种情况?
谢谢!
答案 0 :(得分:0)
您收到的警告是因为您尝试以非推荐方式分配值。有关详细信息,请参阅:https://stackoverflow.com/a/20627316/7386332。
相反,你应该这样做:
import pandas as pd
import numpy as np
s = pd.DataFrame({'A':['S12','S1','E53',np.NaN], 'B':[1,2,3,4]})
s.A.fillna('P', inplace=True) # alternative: s.A.replace(np.NaN, 'P', inplace=True)
要以正确的方式访问值,您应使用loc
。有些东西:
s.loc[:,'A'] = s.loc[:,'A'].replace(np.NaN,'P')
答案 1 :(得分:0)
设置值时应使用loc
。
基本上,无法保证__setitem__
调用将在原始数据帧或内存中的副本上执行。您应该真正阅读错误方法(indexing-view-versus-copy)中提到的部分。首选方法是:
s.loc[s.A.isnull(), 'A'] = 'P'