我有一个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, 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将我的代码性能降低,并重复相同的方法来获取索引.
df=pd.read_csv('s1.csv')#code to reproduce input
解决方法:
解决方案,如果每行都有更多非缺失行,如阈值:
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, 123.0]
1 NaN NaN r2 [12.0, 23.0, 23.0]
2 NaN NaN r3 [23.0, 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.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[:, :-1].values, 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, 23.0, 23.0, 23.0, 123.0]
1 NaN NaN r2 [45.0, 12.0, 23.0, 23.0]
2 NaN NaN r3 [56.0, 34.0, 23.0, 323.0, 12.0]
3 324.0 234.0 r4 [2343.0, 2344.0, 2.0, 324.0, 234.0]
4 NaN NaN r5 [5.0, 675.0, 34.0, 34.0, 34.0]
5 NaN NaN r6 [34.0, 45.0, 45.0, 45.0]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。