python - 从列中查找第一个非空值
问题描述
我使用这样的 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
语句内部并且它应该只打印一次,当值不为空并且找到第一个非值时。有什么替代方法可以实现这一目标?
解决方案
您可以将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
推荐阅读
- javascript - 如何在 pugjs 模板中使用 i18n?
- javascript - 在另一个模块中调用使用全局变量的函数
- windows - 如何在 DDD 架构中分离 ASP.NET Core IDENTITY?
- node.js - 此包中的 ratelimit 装饰器 loopback4-ratelimiter 不起作用
- python - 如果值 = 1(二进制值),则提取列名并将它们与分隔符组合并将其放入新列
- python - vscode 无法跳转到函数定义
- c++ - Boost Asio 客户端无法使用自签名证书连接到服务器
- go - 使用全局变量时goroutines死锁
- azure - 将流分析作业中的输出数据流式传输到 Azure Synapse Analytics sql 池表?
- swiftui - 表单内的 SwiftUI 全屏宽度内容