如何使用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与 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] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |