python - 如何使用 pandas 获取每行中的最后 n 个值
问题描述
我有一个 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,这会使我的代码性能降低,并重复相同的方法来获取索引。
我希望为这个问题得到明确的性能解决方案。
输入数据框文件在这里
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, 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]
推荐阅读
- batch-file - 批处理计算运行了多少秒
- android - 获得意图后我应该清除 bundle getExtra 吗?
- codeigniter - Codeigniter 文件上传在更新到最新版本后无法正常工作。
- node.js - 从承诺而不是控制台返回值
- python - 在 python pip 命令中指定 Visual Studio 2012 版本
- mysql - 表 1 上的所有条目,但仅匹配表 2 上的整体,其中表 2 包含 where 语句
- .net - 如何在 VSTS 成功构建后发送代码覆盖率和测试(失败和通过)计数?
- css - 切换图标未出现在 React-Accessible-Accordion 上
- c# - C# 声明类型定义无法创建抽象类或接口的实例
- c - 如何使用换行符退出 scanf 循环。目前无限循环