【发布时间】:2019-04-12 08:58:15
【问题描述】:
今天我发生了一件奇怪的事情。我需要根据一系列 if 语句创建一个列表。我的数据框看起来像这样:
prom_lect4b_rbd prom_lect2m_rbd prom_lect8b_rbd prom_lect6b_rbd
100 np.nan 80 200
np.nan np.nan 40 1000
np.nan np.nan np.nan 90
230 100 80 100
列是根据它们的优先级排序的。我试图创建的列表(或列)从那些不是nan 的行中获取第一个值。所以,在这种情况下,我想要一个如下所示的列:
simce_final_lect
100
40
90
230
我尝试了以下方法:
cols=[simces.prom_lect4b_rbd, simces.prom_lect2m_rbd, simces.prom_lect8b_rbd, simces.prom_lect6b_rbd]
simce_final_lect=[j if np.isnan(j)==False else k if np.isnan(k)==False
else l if np.isnan(l)==False else m if np.isnan(m)==False
else np.nan for j,k,l,m in zip(cols[0],cols[1],cols[2],cols[3])]
这只是将两个值(共 8752 个)复制到列表中。但如果我将我的 zip 限制为 j,k,l,它就可以完美运行:
simce_final_lect=[j if np.isnan(j)==False else k if np.isnan(k)==False
else l if np.isnan(l)==False
else np.nan for j,k,l in zip(cols[0],cols[1],cols[2])]
你知道发生了什么吗?否则,我的问题是否有更有效的解决方案?
【问题讨论】:
-
您的最后一列比其他列短。
zip在较短的列表结束时停止。顺便说一句:你真的应该考虑提取将值带入函数的表达式:first_not_nan = lambda vals: next(x for x in vals if not math.isnan(x))然后result = list(map(first_not_nan, zip(A,B,C,D)))。 -
谢谢巴库留!你能进一步解释一下你的方法吗?当尝试在系列的每一行中执行操作时,我并不真正习惯于应用函数之外的 lambda 表达式。当我使用这两个命令时,它得到了一个只有 148 个值的列表。也许当它发现一行只包含
nan时它停止了?在那种情况下,我怎么能用 nan 填充它?谢谢
标签: python pandas for-loop list-comprehension