我希望在Pandas数据帧中找到包含空格(任意大小)的所有值,并将这些值替换为NaNs。
有什么想法可以改进这一点吗?
基本上,我想把这个变成:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
如下所示:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
我已经设法用下面的代码做到了这一点,但是人是丑陋的。这不是Pythonic式的,我确信这也不是对熊猫的最有效的利用。我遍历每一列,并对列掩码进行布尔替换,该掩码是通过应用一个函数生成的,该函数对每个值执行正则搜索,并匹配空格。
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
通过只迭代可能包含空字符串的字段,可以对它进行一些优化:
if df[i].dtype == np.dtype('object')
但这并没有多大的进步
最后,这段代码将目标字符串设置为None,这适用于fillna()
这样的Pandas函数,但是如果我可以直接插入NaN
而不是None
,那么对于完整性来说就更好了。
发布于 2012-11-19 07:15:17
这样如何:
d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)
applymap
函数将一个函数应用于数据帧的每个单元。
发布于 2016-04-29 17:34:48
我这样做了:
df = df.apply(lambda x: x.str.strip()).replace('', np.nan)
或
df = df.apply(lambda x: x.str.strip() if isinstance(x, str) else x).replace('', np.nan)
您可以去掉所有字符串,然后用np.nan
替换空字符串。
发布于 2018-01-08 00:07:40
如果要从CSV文件中导出数据,可以像下面这样简单:
df = pd.read_csv(file_csv, na_values=' ')
这将创建数据框并将空白值替换为Na
https://stackoverflow.com/questions/13445241
复制相似问题