python - 尽管上面几行工作正常,但询问 pandas 是否缺少一个值是行不通的
问题描述
我正在尝试编写代码来替换数据集中的缺失值。替换它们的规则是使用具有 4 个已知点的拉格朗日多项式插值,根据其位置对缺失数据进行插值。
因此,我的代码打算执行以下操作:首先,我添加了两个 for 循环来遍历数据框中的每个数据点,首先是按列,然后是按行。一旦它在列中,它将遍历每一行,直到找到缺失值。我这样做是为了知道每个缺失值的确切位置。现在,代码将尝试找到它找到的缺失值右侧的前两个非缺失值让我说清楚,假设我们在第 3 列,缺失值在第 73 行,代码将测试第 74 行上的值以查看它是否丢失,然后是 75,依此类推,直到找到正好两个,每次找到一个有效值时,它将其存储在一个列表中,然后将该列和行的对应值存储在另一个中列表(假设第 74 个和第 75 个值不丢失,然后它将创建两个列表 t = [74, 75] 和 x = [f(74), f(75)],其中 f(i) 是给定列中第 i 个单元格的值)。找到左侧非缺失值的过程完全相同。最后,它运行我编写的拉格朗日多项式插值并替换数据帧副本上的缺失值。
正如我所描述的,代码的一个缺陷是,如果我们正在处理的缺失值的左侧或右侧只有一个有效值,那么代码将无法正常工作。例如,如果缺失值在第 1 行(第二行),则在它之前只有一个值,即第 0 行中的值。所以我尝试编写一些限制:如果 i(缺失值的行) 加上 k(我们为找到有效值而向左或向右移动的空格数)小于零或大于行数,代码将忽略该值并将其保留为 NaN。
问题是我的代码似乎不起作用,它说它会引发错误
if pd.notna(df[column][i + k]):
我真的不明白为什么会这样,因为我只使用了上面的几行
if pd.isna(df[column][i]):
并且该行根本不会引发错误。
这是我的全部代码
import pandas as pd
import Lagrange #module of mine
df = pd.read_excel(r'pathname') #read data
pd.set_option("display.max_rows", None, "display.max_columns", None) #show all data
redf = df
for column in df: #iterate over columns
for i in df.index: #iterate over rows
if pd.isna(df[column][i]): #detect missing values
t = []
x = []
k = 0
while len(t) <= 2: #find valid data to the right of the missing value
k = k + 1
if i + k <= len(df.index):
if pd.notna(df[column][i + k]):
t.append(i + k)
x.append(df[column][i + k])
else:
break
if len(t) != 2:
continue
k = 0
while len(t) <= 4: #find valid data to the left of the missing value
k = k - 1
if i + k >= 0:
if pd.notna(df[column][i + k]):
t.append(i + k)
x.append(df[column][i + k])
else:
break
if len(t) != 4:
continue
intpol = Lagrange.lagrange(t, x, i)
redf._set_value(i, column, intpol)
print(redf)
这是我运行代码时发生的情况:
Traceback (most recent call last):
File "C:/Users/IRVING/PycharmProjects/giraffe/test3.py", line 18, in <module>
if pd.notna(df[column][i + k]):
File "C:\Users\IRVING\PycharmProjects\giraffe\venv\lib\site-packages\pandas\core\series.py", line 871, in __getitem__
result = self.index.get_value(self, key)
File "C:\Users\IRVING\PycharmProjects\giraffe\venv\lib\site-packages\pandas\core\indexes\base.py", line 4405, in get_value
return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
File "pandas\_libs\index.pyx", line 80, in pandas._libs.index.IndexEngine.get_value
File "pandas\_libs\index.pyx", line 90, in pandas._libs.index.IndexEngine.get_value
File "pandas\_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\hashtable_class_helper.pxi", line 997, in pandas._libs.hashtable.Int64HashTable.get_item
File "pandas\_libs\hashtable_class_helper.pxi", line 1004, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 74
Process finished with exit code 1
任何关于这个问题的解释或帮助将不胜感激,你也可以帮助我优化我的代码,我认为我在缺失值旁边找到有效数据的方式有点笨拙。非常感谢您花时间回答我
解决方案
推荐阅读
- perl - perl 生锈。如何读取数据文件,然后在找到特定字符串时替换该文件中的整行
- python - 测试 str dtype 的规范方法?
- apache-spark - dask 从 spark 读取镶木地板文件
- java - AnyLogic 需要 Java 基础知识吗?
- c - 为什么存储类称为类?
- react-native - 警告:道具类型失败:提供给“PadView”的道具“组件”无效
- javascript - 如何在某些 observable 中使用 combineLatest 和过滤器?
- c# - win2D CanvasControl DrawImage() 通过错误“对象已关闭”?
- vue.js - v-if 不适用于单个文件模板
- java - 我是 Java 新手,目前正在研究如下模型。我在这里得到一个空指针异常