python中循环中的zip()元素有限制吗?

2024-06-16 10:57:42 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我有点奇怪。我需要创建一个基于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])]

你知道发生了什么事吗?否则,有没有更有效的办法来解决我的问题?你知道吗


Tags: false列表ifnpnanzipelsefinal
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

您可以使用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']

相关问题 更多 >