在 pandas 数据框中使用 isnull() 来检查特定值是否为空

Using isnull() in a pandas data frame to check a particular value is null or not

我正在编辑我之前的问题,因为它有缺陷。 我有一个名为 df 的数据框。在该数据框中,列包含值, 其中一些是负值、零和 NaN。 我想替换这些值并将标志的相应值存储在 相应索引处的另一个数据框。

df = pd.read_excel('Check.xlsx')
df_ph_temp = df.iloc[:,2:5]
df_flags = pd.DataFrame(index=df.index, columns=df.columns)
flag_ph_temp = df_flags.iloc[:,2:5]
for rowIndex, row in df_ph_temp.iterrows() :
    for colIndex, value in row.items() :
        if value == 0 :
            df_ph_temp.loc[rowIndex, colIndex] = df_ph_temp.loc[rowIndex - 1, colIndex]
            flag_ph_temp.loc[rowIndex, colIndex] = 1            
        elif value < 0 :
            df_ph_temp.loc[rowIndex, colIndex] = 0
            flag_ph_temp.loc[rowIndex, colIndex] = 1
        elif value > 200 :
            df_ph_temp.loc[rowIndex, colIndex] = 130
            flag_ph_temp.loc[rowIndex, colIndex] = 2
        elif value == np.nan : # Not working... Why?
            df_ph_temp.loc[rowIndex, colIndex] = df_ph_temp.loc[rowIndex - 1, colIndex]
            flag_ph_temp.loc[rowIndex, colIndex] = 1            
        else :
            continue

我没有收到任何错误,但也没有得到所需的输出。替换 NaN 值并存储响应。标志数据框中的标志值,程序的这一部分不起作用。我认为这是因为数据包含超过 2 行的 NaN 值。 有没有办法来解决这个问题?我试过了

df_ph_temp[colIndex].fillna(method ='ffill', inplace = True)

在 if 条件之前,但仍然无法达到预期的结果。

我想不通。请帮忙。

使用pandas,你应该避免循环。使用蒙版过滤和切片来填充您的标志列。为了检测空值,请直接在 pandas 数据框或系列(当您 select 一列)上使用 .isnull() ,而不是像您那样在值上使用。如果您想用其他值替换空值,请使用 .fillna()。

根据您的代码(但不确定它是否有效,分享一些输入数据和预期输出可能会有所帮助),解决方案可能如下所示。

首先像您一样创建空列:

data['Flags'] = None

然后根据“温度阶段”列的条件填充此列(使用 fillna(0) 将所有空值替换为 0 允许您仅测试值是否 <= 0,此替换不适用于最终数据框):

data.loc[data['Temperature phase'].fillna(0) <= 0, "Flags"] = 1
data.loc[data['Temperature phase'] > 200, "Flags"] = 2

现在替换温度阶段值。

对于等于 0 或 null 的值,您似乎已选择将它们替换为数据框中的先前值。您也许可以使用它来实现这一部分。

data.loc[data['Temperature phase'].isnull(), 'Temperature phase'] = data['Temperature phase'].shift().loc[data.loc[data['Temperature phase'].isnull()].index]

首先,此命令使用 .shift() 将温度阶段列中的所有值移动一个,然后过滤温度阶段为空的行,并用移动的温度阶段值中的相应索引替换值。

最后,替换其他温度相位值:

data.loc[data['Temperature phase'] < 0, "Temperature phase"] = 0
data.loc[data['Temperature phase'] > 200, "Temperature phase"] = 130

你不需要标志索引等等,因为标志直接填充在最终的数据帧中。