首页 > 编程问答 >在 pandas 中用 NaN 替换空白值(空白)

在 pandas 中用 NaN 替换空白值(空白)

时间:2024-07-22 04:58:13浏览次数:13  
标签:python pandas dataframe

我想找到 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

代码解释:

  1. df.replace(r'^\s*$', np.nan, regex=True) :
    • r'^\s*$' 是一个正则表达式,表示匹配字符串开头 ( ^ )、结尾 ( $ ) 之间只包含零个或多个空格 ( \s* ) 的字符串。
    • np.nan 是要替换成的值,即 NaN
    • regex=True 表示使用正则表达式进行匹配。

相比你的方法,这种方法更简洁高效,因为它利用了 Pandas 内置的字符串处理功能。它避免了循环和自定义函数,更符合 Pythonic 的风格,也更容易理解和维护。

标签:python,pandas,dataframe
From: 13445241

相关文章

  • 如何立即取消使用 Ollama Python 库生成答案的 Asyncio 任务?
    我正在使用Ollama通过OllamaPythonAPI从大型语言模型(LLM)生成答案。我想通过单击停止按钮取消响应生成。问题在于,只有当响应生成已经开始打印时,任务取消才会起作用。如果任务仍在处理并准备打印,则取消不起作用,并且无论如何都会打印响应。更具体地说,即使单击按钮后,此函数......
  • 使用 np.array 索引过滤 Python 列表
    谁能向我解释一下列表self.data如何使用numpy索引数组selec_idx进行索引/过滤?完整的课程可在https://github.com/kaidic/LDAM-DRW/blob/master/imbalance_cifar.pydefgen_imbalanced_data(self,img_num_per_cls):new_data=[]n......
  • 尝试在cmd(python)中安装turtle
    当我在cmd中编写pipinstallturtle后,这条消息出现在我面前。有人知道该怎么办吗?C:\>pipinstallturtleCollectingturtleUsingcachedturtle-0.0.2.tar.gz(11kB)ERROR:Commanderroredoutwithexitstatus1:command:'C:\Users\Bruger\App......
  • Python + Polars:如何有效地“fill_null”仅 DataFrame 的某些列?
    例如,假设我只想fill_null(strategy="zero")DataFrame的数字列。我当前的策略是这样做:final_df=df.select(cs.exclude(cs.numeric()))final_df.with_columns(df.select(cs.numeric()).fill_null(strategy="zero"))是否有替代的、更惯用或更有效的方法来实现我......
  • 如何将 geopandas 数据框与底图重叠?
    我有一个shapefile,我将其读取为geopandas数据框importgeopandasasgpdgdf=gpd.read_file('myfile.shp')gdf.plot()其中gdf.crs<ProjectedCRS:ESRI:54009>Name:World_MollweideAxisInfo[cartesian]:-E[east]:Easting(metre)-......
  • 如何找到 Windows 上 Python 的安装位置?
    我想找出我的Python在Windows上的安装路径。例如:C:\Python25如何找到Python的安装位置?在Windows上查找Python安装位置的方法有很多种:1.使用where命令(推荐方法):打开命令提示符(cmd)。输入以下命令并按回车键:wherepython......
  • Python Pandas:如何解析没有行结尾的 CSV
    如何解析没有行结尾的CSV文件?示例数据sep=;Id;Date;1;1980-02-29;2;1980-03-10;3;;可以使用lineterminator参数指定行终止符来解析没有行尾的CSV文件。在这种情况下,你可以将lineterminator设置为一个空字符串('')。以下是使用......
  • Python 中的 azure.ai.translation.document - 无法使用当前权限访问源文档位置
    我在使用Python中的azure.ai.translation.document库时遇到问题。我已经在Azure中设置了翻译服务以及带有两个容器的Blob存储。我已使用“用户委托密钥”创建了SAS连接。一种用于源(读取/列表),一种用于目标(写入/列表)。例如我尝试运行Python程序,但源b......
  • 博文标题:探索Python中的元编程:装饰器的魔法
    引言在Python的世界里,装饰器(Decorators)是一种非常强大的特性,它允许程序员在不修改原始函数代码的情况下,为函数添加新的功能。这种机制不仅增强了代码的可读性和可维护性,还提供了高度的灵活性和扩展性。本文将深入探讨装饰器的基本概念、工作原理以及如何利用它们来简化和......
  • 使用Python 和 Selenium 抓取 酷狗 音乐专辑 附源码
    在这篇博客中,我将分享如何使用Python和Selenium抓取酷狗音乐网站上的歌曲信息。我们将使用BeautifulSoup解析HTML内容,并提取歌曲和专辑信息。准备工作首先,我们需要安装一些必要的库:pipinstallrequestsbeautifulsoup4selenium代码实现以下是完整的代码:importosi......