【问题标题】:find 1st non null value from a column从列中查找第一个非空值
【发布时间】:2021-10-12 11:04:06
【问题描述】:

我使用像这样的 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 语句内并且它应该只打印一次,当值不为空并且找到第一个非值时。有什么替代方法可以实现这一目标?

【问题讨论】:

    标签: python pandas dataframe numpy lambda


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 2021-06-16
      • 2021-12-03
      • 2017-06-27
      • 1970-01-01
      • 2021-10-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多