首页 > 解决方案 > 尽管上面几行工作正常,但询问 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

任何关于这个问题的解释或帮助将不胜感激,你也可以帮助我优化我的代码,我认为我在缺失值旁边找到有效数据的方式有点笨拙。非常感谢您花时间回答我

标签: pythonpandasdataframe

解决方案


推荐阅读