首页 > 解决方案 > 从列中查找第一个非空值

问题描述

我使用这样的 lambda 函数来传递行值,它们可以按需要工作:

def get_price(row, source):
    if source == 'cgo':
        return row.price

df_merged['price'] = df_merged.apply(lambda x: get_price(x, 'cgo')
                                               , axis=1)

但是,现在我想使用更复杂的 lambda 函数。例如,如果df_merged.art = 'R' 和 df_merged.ust = 'J',那么我想从 df_merged.kst列返回第一个非空值的前 2 个字符。我正在尝试这个:

def get_id(row, source):
    if source == 'cgo':
        found = False

        if found == False:

            #if row.kst != Null:
            if (row.kst):

                first_kst= row.kst
                logger.debug(f"first_kst : {first_kst}")

                found = True


        if row.art == "R" and row.ust == "J":
            return first_kst[:2]

df_merged['id'] = df_merged.apply(lambda x: get_id(x, 'cgo')
                                               , axis=1)

当我找到第一个非空值时,我使用布尔值found停止搜索。然后我first_kst在条件满足时返回存储的值。但是,这不能按预期工作。

在我的打印日志中,我看到 DEBUG | first_kst : nan |多次,即使我的打印语句在 if语句内部并且它应该只打印一次,当值不为空并且找到第一个非值时。有什么替代方法可以实现这一目标?

标签: pythonpandasdataframenumpylambda

解决方案


您可以将numpy.isnan()与 not 运算符 ( ~) 一起使用。

import numpy as np

def not_na(array):
    return ~np.isnan(array)

def first_not_na_value(array):
    return list(filter(not_na, array))[0]

例子:

d= {
    'A':[1, 2, 3, 4, np.nan, 6, 7, 8, 9],
    'B':[np.nan, np.nan, 3, 4, np.nan, 6, 7, 8, 9],
    'C':[1, 2, 3, 4, 5, 6, 7, 8, 9]
}

df = pd.DataFrame(d)

first_not_na_value(df.A) #outputs 1.0
first_not_na_value(df.B) #outputs 3.0
first_not_na_value(df.B) #outputs 1.0

推荐阅读