【发布时间】:2019-01-11 05:55:16
【问题描述】:
我有一个 df,其中包含与下面非常相似的内容。它有很多列,其中一些包含 NaN。我想从每一行中获取最后 n 个元素,不包括 NaN。其中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,这会使我的代码性能降低,并重复相同的方法来获取索引。
我希望为这个问题得到明确的性能解决方案。
输入数据框文件为 here
df=pd.read_csv('s1.csv')#code to reproduce input
【问题讨论】:
-
你能提供代码来重现你的数据框吗?
-
@MohitMotwani - 添加