【问题标题】:Is there a limit for zip() elements in loops in python?python 循环中的 zip() 元素是否有限制?
【发布时间】: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


【解决方案1】:

您可以使用bfill(axis=1) 并选择第一列。

df.bfill(axis=1).iloc[:,0]

0    100.0
1     40.0
2     90.0
3    230.0
Name: prom_lect4b_rbd, dtype: float64

## For list
df.bfill(axis=1).iloc[:,0].tolist()
['100', '40', 90, '230']

【讨论】:

  • 谢谢你,工作就像一个魅力! Pythonic 和简单,比我的解决方案更简单。
  • @JuanC 乐于助人。 :)
【解决方案2】:

使用first_valid_index():

df.apply(lambda x: x[x.first_valid_index()], axis=1)

产量:

0    100.0
1     40.0
2     90.0
3    230.0
dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2018-09-21
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多