加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何使用pandas获取每行中的最后n个值

发布时间:2020-12-20 12:14:57 所属栏目:Python 来源:网络整理
导读:我有一个df,其中包含与下面非常相似的内容.它有很多列,其中一些包含NaN.我想从除NaN之外的每一行中获取最后n个元素.其中n代表3. 输入: col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 NaN NaN 23.0 23 23.0 NaN 23.0 23.0 123.0 NaN NaN 1 N
我有一个df,其中包含与下面非常相似的内容.它有很多列,其中一些包含NaN.我想从除NaN之外的每一行中获取最后n个元素.其中n代表3.

输入:

col1  col2  col3  col4   col5  col6    col7  col8   col9   col10  col11  
0   NaN   NaN  23.0    23   23.0   NaN    23.0  23.0  123.0     NaN    NaN   
1   NaN   NaN   NaN    45   12.0  23.0    23.0   NaN    NaN     NaN    NaN   
2  45.0  56.0  34.0    23  323.0  12.0     NaN   NaN    NaN     NaN    NaN   
3   NaN   NaN  34.0    65    NaN  65.0  2343.0   NaN    NaN  2344.0    2.0   
4   NaN   NaN   NaN     5  675.0  34.0    34.0  34.0    NaN     NaN    NaN   
5  34.0  45.0  45.0    45    NaN   NaN     NaN   NaN    NaN     NaN    NaN   

   col12  col13   I  
0    NaN    NaN  r1  
1    NaN    NaN  r2  
2    NaN    NaN  r3  
3  324.0  234.0  r4  
4    NaN    NaN  r5  
5    NaN    NaN  r6

输出:

col1  col2  col3  col4   col5  col6    col7  col8   col9   col10  col11  
0   NaN   NaN  23.0    23   23.0   NaN    23.0  23.0  123.0     NaN    NaN   
1   NaN   NaN   NaN    45   12.0  23.0    23.0   NaN    NaN     NaN    NaN   
2  45.0  56.0  34.0    23  323.0  12.0     NaN   NaN    NaN     NaN    NaN   
3   NaN   NaN  34.0    65    NaN  65.0  2343.0   NaN    NaN  2344.0    2.0   
4   NaN   NaN   NaN     5  675.0  34.0    34.0  34.0    NaN     NaN    NaN   
5  34.0  45.0  45.0    45    NaN   NaN     NaN   NaN    NaN     NaN    NaN   

   col12  col13   I                 res1  
0    NaN    NaN  r1  [23.0,23.0,123.0]  
1    NaN    NaN  r2   [12.0,23.0]  
2    NaN    NaN  r3    [23,323.0,12.0]  
3  324.0  234.0  r4  [2.0,324.0,234.0]  
4    NaN    NaN  r5   [34.0,34.0,34.0]  
5    NaN    NaN  r6     [45.0,45.0,45]

到目前为止,我使用下面的代码获得解决方案

df['res1']=df.apply(lambda x:x.dropna().values.tolist()[len(x.dropna().values.tolist())-4:len(x.dropna().values.tolist())-1],axis=1)

我的解决方案看起来非常无效,首先我使用lambda将我的代码性能降低,并重复相同的方法来获取索引.

我希望能为这个问题找到明确的性能解决方案.

输入Dataframe文件是 here

df=pd.read_csv('s1.csv')#code to reproduce input

解决方法

解决方案,如果每行都有更多非缺失行,如阈值:

使用numpy与justify功能:

df['res1'] = justify(df.iloc[:,:-1].values,invalid_val=np.nan,side='right')[:,-3:].tolist()
print (df)
   col1  col2  col3  col4   col5  col6    col7  col8   col9   col10  col11  
0   NaN   NaN  23.0    23   23.0   NaN    23.0  23.0  123.0     NaN    NaN   
1   NaN   NaN   NaN    45   12.0  23.0    23.0   NaN    NaN     NaN    NaN   
2  45.0  56.0  34.0    23  323.0  12.0     NaN   NaN    NaN     NaN    NaN   
3   NaN   NaN  34.0    65    NaN  65.0  2343.0   NaN    NaN  2344.0    2.0   
4   NaN   NaN   NaN     5  675.0  34.0    34.0  34.0    NaN     NaN    NaN   
5  34.0  45.0  45.0    45    NaN   NaN     NaN   NaN    NaN     NaN    NaN   

   col12  col13   I                 res1  
0    NaN    NaN  r1  [23.0,23.0]  
2    NaN    NaN  r3  [23.0,34.0]  
5    NaN    NaN  r6   [45.0,45.0]

如果没有,需要循环:

#changed a bit https://stackoverflow.com/a/40835254
def loop_compr_based(a,last):
    mask = ~np.isnan(a)
    stop = mask.sum(1).cumsum()
    start = np.append(0,stop[:-1])
    am = a[mask].tolist()
    out = np.array([am[start[i]:stop[i]][-last:] for i  in range(len(start))])
    return out

df['res1'] = loop_compr_based(df.iloc[:,5).tolist()
print (df)
   col1  col2  col3  col4   col5  col6    col7  col8   col9   col10  col11  
0   NaN   NaN  23.0    23   23.0   NaN    23.0  23.0  123.0     NaN    NaN   
1   NaN   NaN   NaN    45   12.0  23.0    23.0   NaN    NaN     NaN    NaN   
2  45.0  56.0  34.0    23  323.0  12.0     NaN   NaN    NaN     NaN    NaN   
3   NaN   NaN  34.0    65    NaN  65.0  2343.0   NaN    NaN  2344.0    2.0   
4   NaN   NaN   NaN     5  675.0  34.0    34.0  34.0    NaN     NaN    NaN   
5  34.0  45.0  45.0    45    NaN   NaN     NaN   NaN    NaN     NaN    NaN   

   col12  col13   I                                 res1  
0    NaN    NaN  r1      [23.0,123.0]  
1    NaN    NaN  r2             [45.0,12.0,23.0]  
2    NaN    NaN  r3      [56.0,12.0]  
3  324.0  234.0  r4  [2343.0,2344.0,2.0,234.0]  
4    NaN    NaN  r5       [5.0,675.0,34.0]  
5    NaN    NaN  r6             [34.0,45.0]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读