我想找到 Pandas 数据框中包含空格(任意数量)的所有值,并将这些值替换为 NaN。
有什么想法可以改进吗?
基本上我想把这个:
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,我确信它也不是 pandas 最有效的使用方式。我循环遍历每一列,并对通过应用对每个值进行正则表达式搜索并匹配空白的函数生成的列掩码进行布尔替换。
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,它与 Pandas 的函数如
fillna()
一起使用,但如果我实际上可以插入一个
NaN
直接代替
None
可以使用
replace()
方法来实现,它可以接受一个正则表达式来匹配需要替换的值。
import pandas as pd
# 创建示例 DataFrame
df = pd.DataFrame({
'A': [-0.532681, 1.490752, -1.387326, 0.814772, -0.222552, -1.176781],
'B': ['foo', 'bar', 'foo', 'baz', ' ', 'qux'],
'C': [0, 1, 2, ' ', 4, ' ']
}, index=pd.date_range('2000-01-01', periods=6))
# 使用正则表达式替换空白值为 NaN
df = df.replace(r'^\s*$', np.nan, regex=True)
print(df)
这段代码会将 DataFrame 中所有只包含空格(包括空字符串)的值替换为
NaN
。
代码解释:
-
df.replace(r'^\s*$', np.nan, regex=True)
:-
r'^\s*$'
是一个正则表达式,表示匹配字符串开头 (^
)、结尾 ($
) 之间只包含零个或多个空格 (\s*
) 的字符串。 -
np.nan
是要替换成的值,即NaN
。 -
regex=True
表示使用正则表达式进行匹配。
-
相比你的方法,这种方法更简洁高效,因为它利用了 Pandas 内置的字符串处理功能。它避免了循环和自定义函数,更符合 Pythonic 的风格,也更容易理解和维护。
标签:python,pandas,dataframe From: 13445241