如何在python中用null之前的所有前一个值和null之后的第一个后继值的平均值填充null值?

2023-12-30

enter image description hereI have a dataframe with 5000 records. I want the null values to be filled with:

平均值(null 之前的所有前一个值,null 之后的第一个后继值)

data:

Date          gcs     Comp     Clay       WTS
2020-01-01    1550     41      9.41      22.6
2020-01-02    1540     48      9.50      25.8
2020-01-03    NAN      NAN     NAN        NAN
2020-01-04    1542     42      9.30      23.7
2020-01-05    1580     48      9.10      21.2
2020-01-06    NAN     NAN      NAN       NAN
2020-01-07    1520     40      10        20.2
2020-01-08    1523     30      25         19

例子: 对于日期 2020-01-03,我希望 gcs 列中的空值用 Average(1550,1540,1542) 填充,得到 1544。

1550 和 1540 是 null 之前的前面的值,1542 是 null 之后的第一个后续值。

相似地,

对于日期 2020-01-06,我希望填充 gcs 列的空值 平均值 (1550,1540,1544,1542,1580,1520) 给出 1546。

1550 到 1580 是 null 之前的前一个值,1520 是 null 之后的第一个后续值。

Desired Output:

Date          gcs     Comp     Clay       WTS
2020-01-01    1550     41      9.41      22.6
2020-01-02    1540     48      9.50      25.8
2020-01-03    1544     43.66   9.403     24.03
2020-01-04    1542     42      9.30      23.7
2020-01-05    1580     48      9.10      21.2
2020-01-06    1546     43.77   9.45      22.92
2020-01-07    1520     40      10        20.2
2020-01-08    1523     30      25         19

**Edit:

感谢汤姆的回复。 我将日期列保留为索引并尝试了以下代码:

def foo(row):
    if any(row.isna()):
        df.loc[row.name,row.isna()] = df.expanding().mean().shift(-1).loc[row.name,:]
df.apply(foo, axis=1)

我得到的输出是:

Date
2020-01-01    None
2020-01-02    None
2020-01-03    None
2020-01-04    None
2020-01-05    None
2020-01-06    None
2020-01-07    None
2020-01-08    None
dtype: object


你能帮我找出问题所在吗?


以下似乎有效。您定义一个apply修改行的函数df到位。每次到达一行(具有空值)时,您都可以采取expanding的平均值df(see here https://stackoverflow.com/a/43414120/13386979), 用一个shift包括以下行。然后你使用loc覆盖df使用新值:

def foo(row):
    if any(row.isna()):
        df.loc[row.name,row.isna()] = df.expanding().mean().shift(-1).loc[row.name,:]

申请:

>>>df.apply(foo, axis=1)

               gcs       Comp       Clay        WTS
Date                                               
2020-01-01  1550.0  41.000000   9.410000  22.600000
2020-01-02  1540.0  48.000000   9.500000  25.800000
2020-01-03  1544.0  43.666667   9.403333  24.033333
2020-01-04  1542.0  42.000000   9.300000  23.700000
2020-01-05  1580.0  48.000000   9.100000  21.200000
2020-01-06  1546.0  43.777778   9.452222  22.922222
2020-01-07  1520.0  40.000000  10.000000  20.200000
2020-01-08  1523.0  30.000000  25.000000  19.000000

请注意,我移动了你的Date列作为索引。我认为上面的方法应该适用于缺少值的地方,确保从上到下填充值。

我不确定它将如何处理扩展到 5000 行,但似乎你必须使用apply或某个循环 b/c 您希望在计算未来估算值*时包含估算值。我添加了if语句 b/c 似乎大大加快了计算速度:

%%timeit
df.apply(foo, axis=1)
#1.17 ms ± 25.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
df.apply(foo_without_if, axis=1)
#16.2 ms ± 201 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

*如果您不想这样做(即您可以只采用滚动平均值但忽略前面行中的 NA),您可以执行以下操作:

mask = df.isna()
df[mask] = df.expanding().mean()[mask.shift(1)].shift(-1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在python中用null之前的所有前一个值和null之后的第一个后继值的平均值填充null值? 的相关文章

随机推荐

  • Ember.js - 正确执行(结构、包含、一般问题)

    我正在使用 ember js 并且不知何故陷入了寻找如何以正确的方式构建结构的困境 我可以跟随所有例子 http emberjs com guides 但将它们放在一起时遇到一些问题 我正在使用 require js 和车把 我的目录结构如
  • 总结不同格式日期的小时数。 C#

    我有个问题 我需要用代码总结在办公室的工作时间 我从 SQL Server 获取的日期没有问题 但我有不同的格式 例如 2019 09 23 14 54 23 2019 09 23 14 54 23 or 2019 09 23 14 54
  • Android volley 在所有请求完成时获取回调

    我正在使用 volley 对一系列请求进行排队 当这些请求发生时 我向用户显示一个进度对话框 有没有办法可以检查所有这些请求何时完成 这就是我要的 Show progress bar for int i 0 i
  • std::is_same 结果与左值和右值引用

    我正在将 std is same 实用程序函数与右值和左值引用结合使用 并遇到了奇怪的行为 考虑这个检查变量 t 类型的函数模板 我正在使用 VS 2013 struct Test template lt class T gt void h
  • 使用子进程从 python 执行时,ssh 未被识别为命令?

    这是我的代码 import subprocess import sys HOST xyz3511 uhc com Ports are handled in ssh config since we use OpenSSH COMMAND up
  • jQuery 将小数添加到 SELECT,没有重复项并可选择删除

    好的 这里是 需要过滤掉重复项并能够删除添加到选择框的值 Number
  • 检测 Vue-Router 导航卫士中的后退按钮

    路线如何改变对于我的情况很重要 所以 我想捕捉浏览器或 gsm 的后退按钮何时更改路线 这就是我所拥有的 router beforeEach to from next gt if IsItABackButton from meta some
  • Javascript 文件组织和设计

    真正进入 Web 开发 特别是 JS 所以我想知道 JS 文件组织和职责委派方面的最佳实践是什么 我问这个是因为这种结构对我来说是有意义的 主页 PHP 包括对中央 JS 文件的引用 MAIN Javascript 文件 包括对仅包含命名空
  • 点击 linkedin 的 http get 请求,在 Angular 2 中给出错误

    我正在使用 linkedin 进行注册 需要获取访问代码和基本个人资料详细信息 但是当我发布请求时 我的控制台中出现 CORS 错误 当我直接在浏览器中点击 URL 时 它会将我正确地带到登录页面 满足请求会出现什么问题 CORS 问题已解
  • 允许国际字符的弹出式虚拟键盘

    我正在为我们正在开发的应用程序寻找特定的 Javascript 解决方案 我们其实曾经拥有过它 但我们已经失去了它 捂脸 发生的事情如下 单击键盘图像 弹出虚拟键盘 允许用户选择一堆国际按键 例如德国的变音符号 塞尔维亚语的西里尔字母等 我
  • 冬眠。 PSQLException:int 类型的错误值:admin

    我有一个带有 JAVA 和 Hibernate 的桌面应用程序4 3 1 现在我只有两个实体 用户和角色 User ManyToOne fetch FetchType LAZY Fetch FetchMode JOIN JoinColumn
  • NgMap 集群在缩放后更改标记颜色

    我想改变标记的颜色 我在用着ng map显示地图 我还在这个库中使用集群选项 我的问题 我可以更改标记颜色并且可以看到这一点 但是一旦开始缩放 标记颜色就会更改为默认颜色 红色 这是我的代码
  • Twitter 请求令牌 OAuth 401 错误

    尝试使用 OAuth 添加 twitter 登录 但请求令牌的第一步是一场噩梦 这会一如既往地导致 401 错误 我使用 twitter 的 Test OAuth 工具来比较我的 scala 服务器发送的 http 请求 Curl要求wor
  • 设置 Excel 单元格格式(货币)

    我开发了一个 Excel 插件 这样您就可以将 MySQL 数据库中的一些数字插入到特定单元格中 现在我尝试将这些单元格格式化为货币 但遇到两个问题 1 在格式化单元格上使用公式时 总和显示如下 353 2574 欧元 我需要做什么才能以适
  • 在 C++ 中读取大型 .txt 文件时出现奇怪的错误[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个非常大的 txt 文件 该文件有 128x128x128 2097152 行 线性化 3d 空间 其中仅包含一个 0 或 1 行 不要问为什么 我将代码缩减为几行似乎当我计算行和增量时 一切都很
  • WPF 嵌套用户控件绑定

    我正在尝试将一个值从 Window 绑定到 UserControl 内的 UserControl 中 但是 由于某种原因 据我所知 内部 UserControl 甚至从未尝试绑定 主窗口 xaml
  • NameValueCollection 到 URL 查询?

    我知道我能做到 var nv HttpUtility ParseQueryString req RawUrl 但是有没有办法将其转换回 url 呢 var newUrl HttpUtility Something page nv 只需致电T
  • 关于 scala 私有字段变量的困惑

    我已经进入 Scala 学习的第三天了 使用书 开始scala 作者用一个例子来展示带 val var 和不带 var val 的变量定义之间的区别 class Book private val title String def print
  • 如何在 IntelliJ 中运行角度应用程序

    我正在按照 IntelliJ 中的步骤来支持 Angular https www jetbrains com help idea 2017 1 using angular html install angular cli https www
  • 如何在python中用null之前的所有前一个值和null之后的第一个后继值的平均值填充null值?

    I have a dataframe with 5000 records I want the null values to be filled with 平均值 null 之前的所有前一个值 null 之后的第一个后继值 data Dat