如何编写返回插值的函数(pandas 数据帧)?

2023-12-26

我有一个作为 pandas 数据框导入的 xls 文件。它具有 NaN 值;如何设置一个函数,用相邻值之间的插值替换 NaN?我不能使用 pd.DataFrame.interpolate 或任何现有的插值函数,因为我应该创建自己的函数。

这是我所拥有的,但我认为这是非常错误的。抱歉,对 Python 还很陌生:(

import pandas as pd
file = pd.read_excel("xls file")

def interpolate(x):
  for i in range(len(x)):
    if x.iloc[i, -1].isnull():
      x.iloc[i,-1] = (((x.iloc[i-1, -1]) + (x.iloc[i+1, -1]))/2)
    else:
      x.iloc[i,-1] = x.iloc[i, -1]

interpolate(file)

例如,数据框最初看起来像这样:

0   1.04
1   0.99
2   NaN
3   1.05
4   1.05

我希望它返回:

0   1.04
1   0.99
2   1.02
3   1.05
4   1.05

为此,假设没有连续的 NaN 条目


该解决方案重现了以下行为pd.Series.interpolate https://pandas.pydata.org/docs/reference/api/pandas.Series.interpolate.html使用默认参数。这不是一个适合初学者的解决方案,如果您的问题是家庭作业,我很想知道您的教授的期望是什么。

我正在使用具有前导、尾随和连续的数据框nan价值观。我添加了一列带有插值的列来与我的解决方案进行比较。 ASeries需要使用默认排序范围索引。

import pandas as pd
import numpy as np

np.random.seed(11)
a = np.where(np.random.rand(20) > .5, np.random.uniform(0,10, 20), np.nan)
df = pd.DataFrame({
    'x': a
})
df['x_interp'] = df.x.interpolate()
df

Output

           x  x_interp
0        NaN       NaN
1        NaN       NaN
2        NaN       NaN
3   3.187988  3.187988
4        NaN  2.661738
5        NaN  2.135487
6        NaN  1.609237
7        NaN  1.082987
8   0.556737  0.556737
9   4.797973  4.797973
10  4.016765  4.016765
11       NaN  5.597628
12  7.178492  7.178492
13  6.020641  6.020641
14       NaN  7.755832
15  9.491024  9.491024
16       NaN  9.491024
17       NaN  9.491024
18       NaN  9.491024
19       NaN  9.491024

该方法是找到具有nan以及周围的价值观。然后用周围值之间的线性步长填充这些切片。这ffill参数控制是否尾随nan将用最后一个可用值填充。

def interp(ser, ffill=True):
    ser = ser[df.x.notna().idxmax():].copy()
    start = ser.notna() & ser.shift(-1, fill_value=0).isna()
    end = ser.notna() & ser.shift(1, fill_value=0).isna()
    
    for x,y in zip(ser.index[start],ser.index[end]):
        step = (ser.loc[y] - ser.loc[x])/(y - x)
        ser.loc[x:y] = [ser.loc[x] + i * step for i in range(y-x)] + [ser.loc[y]]

    if ffill:
        ser = ser.ffill()
        
    return ser

df['x_new_interp'] = interp(df.x, False)
df['x_new_interp_ffill'] = interp(df.x)
df

Output

           x  x_interp  x_new_interp  x_new_interp_ffill
0        NaN       NaN           NaN                 NaN
1        NaN       NaN           NaN                 NaN
2        NaN       NaN           NaN                 NaN
3   3.187988  3.187988      3.187988            3.187988
4        NaN  2.661738      2.661738            2.661738
5        NaN  2.135487      2.135487            2.135487
6        NaN  1.609237      1.609237            1.609237
7        NaN  1.082987      1.082987            1.082987
8   0.556737  0.556737      0.556737            0.556737
9   4.797973  4.797973      4.797973            4.797973
10  4.016765  4.016765      4.016765            4.016765
11       NaN  5.597628      5.597628            5.597628
12  7.178492  7.178492      7.178492            7.178492
13  6.020641  6.020641      6.020641            6.020641
14       NaN  7.755832      7.755832            7.755832
15  9.491024  9.491024      9.491024            9.491024
16       NaN  9.491024           NaN            9.491024
17       NaN  9.491024           NaN            9.491024
18       NaN  9.491024           NaN            9.491024
19       NaN  9.491024           NaN            9.491024
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写返回插值的函数(pandas 数据帧)? 的相关文章

随机推荐

  • 在python中添加atom中的模块

    我的计算机上安装了 pygame 和 tkinter 模块 但我无法找到如何在文本编辑器 Atom 中访问它们 我可以在 IDLE 中使用它们 import pygame 但是当我尝试将其导入atom 时 它无法识别该模块 有人知道为什么吗
  • Firefox 是否支持表格元素上的position:relative?

    当我尝试使用时position relative position absolute on a th or td 在 Firefox 中它似乎不起作用 简单且最正确的方法是将单元格的内容包装在 div 中并添加相对于该 div 的位置 ex
  • .net core razor 页面中的多个视图组件未正确绑定

    我正在使用 razor 页面创建一个 net core 5 Web 应用程序 并且正在努力将我创建的视图组件绑定到我的页面 如果我在页面上有多个相同的视图组件 以下完美运行 我的页面 cshtml page model MyPageMode
  • 多个邮件附件 - PhoneGap

    您好 我正在phonegap中做一个应用程序 它需要有多个附件 但我无法有多个附件 任何解决方案 我的代码如下
  • 使用单个函数调用写入多个文件描述符

    我有一个群聊服务器的用例 其中服务器必须向所有客户端的套接字写入一个公共字符串 然后 我通过循环遍历文件描述符列表并将字符串写入每个文件描述符来解决这个问题 现在我正在考虑寻找更好的解决方案 是否可以通过使用 Linux 中的 tee 系统
  • 在 Swift 3.0 中转换 base64String 中的音频文件

    我正在使用以下代码录制音频文件 let audioFilename getDocumentsDirectory appendingPathComponent tt mp4 let settings AVFormatIDKey Int kAu
  • 修改多维 numpy 数组中的对角线

    我有一个形状为 7 3 7 3 的多维 numpy 数组 我想修改轴 0 和轴 2 重合的广义对角线 这个广义对角线将被定义为数组中第 0 个和第 2 个索引重合的元素 并且形状为 3 3 7 Doing arr diagonal axis
  • 在 Vbscript 中终止进程

    我试图终止名为 AetherBS exe 的进程的所有实例 但以下 VBscript 不起作用 我不太确定在哪里 为什么会失败 那么我怎样才能杀死 AetherBS exe 的所有进程呢 CloseAPP AetherBS exe Func
  • Boost.Spirit 将表达式转换为 AST

    使用 Boost Spirit 将某些表达式转换为 AST 的正确方法是什么 我尝试构建它 但我认为它很混乱 可以简化很多 https godbolt org z VXHXLY https godbolt org z VXHXLY incl
  • 调试非托管 Neo4j 扩展

    我刚刚开始使用 Graphaware 框架为 Neo4j 服务器开发一个非托管扩展 到目前为止一切都很好 甚至单元测试也有效 但我想实际调试从 Intellij 内部运行 Neo4j 服务器的扩展 有人能给我一个关于如何做到这一点的提示吗
  • Spring Batch 多数据源和 ChainedTransactionManager 风险

    我正在研究由两个数据源组成的 Spring Batch 的可行性 用于 Spring Batch 元数据的 SQL 数据源和用于业务数据的 MongoDB 数据源 具有事务性用途 交易方面在这里提出了几个问题 以下主题 使用 MongoDB
  • 让 Django 走向绿色

    我有一个 Django 管理命令 可以发出数千个 TCP UDP 请求 我使用 Gevent 来加快速度 因为我重组了代码以作为协程工作 套接字连接不再阻塞 但从我读到的内容来看 Django 的某些部分仍然不是绿色的 我所说的绿色 是指使
  • 如何使用 JSTL 在 JSF 1.2 页面中强制构建阶段?

    我在 JSF 应用程序中使用 JSTL 标签 通过某些操作 我需要重建组件树 就像它是初始构建一样 我当前的症状是对象与组件关联不正确 重复的 ID 以及陈旧组件的其他问题 这是使用在构建阶段使用的 c foreach 不能使用重复标记 请
  • 我们如何确定我们使用的是 Web API 1 还是 Web API 2?

    介绍一下问题 我想知道我们使用的是Web API 1还是2 我自己的packages config指示版本5 0 0 这是 Web API 1 还是 2 搜索和研究 我尝试过谷歌搜索以下内容 网络 API 1 网络 API 2 and AS
  • Rhino 中没有 Array.filter() 吗?

    为什么我不能使用Array filter 在犀牛 代码是这样的 var simple reason a b c print typeof simple reason filter var not so simple reason new A
  • WinForms:无需使用 FormWindowState.Normal 即可查找最小化表单的大小

    有没有一种简单的方法可以确定 WindowState Normal 中窗体的大小 而无需实际更改窗体状态 这是我现在所做的 C 代码 public class MyForm Form public void MyMethod FormWin
  • VB.NET 将 Tab 键发送到另一个应用程序窗口

    我想将 TAB 键发送到另一个应用程序window 将密钥发送到窗口而不是文本框 I tried SendMessage hWnd WM SETHOTKEY VK TAB 0 什么都没发生 我的目标是 将 Tab 键发送到我的应用程序Or当
  • 使用带有 CommaDelimitedList 参数的 Cloudformation Join 函数来构建 IAM ARN

    我一直在尝试构建一个存储桶策略 以允许对 CloudFormation 中的集中帐户执行操作到共享相同模式的一系列其他帐户中的 IAM 角色 即 arn aws iam 111111111111 role my role arn aws i
  • Golang:如何将字符串转换为二进制表示形式

    在golang中 如何将字符串转换为二进制字符串 示例 CC 变为 10000111000011 这是一个简单的方法 func stringToBin s string binString string for c range s binS
  • 如何编写返回插值的函数(pandas 数据帧)?

    我有一个作为 pandas 数据框导入的 xls 文件 它具有 NaN 值 如何设置一个函数 用相邻值之间的插值替换 NaN 我不能使用 pd DataFrame interpolate 或任何现有的插值函数 因为我应该创建自己的函数 这是