python - 如何在某些条件下制作一个 numpy 数组?
问题描述
我有一个 numpy 结构化数组,如下所示:
idx lvl start end
60 71 10.0 0.0
60 72 0.0 25.0
60 73 0.0 35.0
61 73 5.0 0.0
65 71 5.0 0.0
67 72 5.0 0.0
67 74 0.0 10.0
...
我想在某些条件下用它制作一个新数组。
1) 使用至少有一个起始值和一个结束值的行(本例中使用 idx 60 和 67 行)。
2) 如果有多个起始值和结束值,则只使用该级别的最大结束值级别和最小起始值级别(idx 60 将有 71 和 73)。
结果将如下所示:
idx start_lvl end_lvl
60 71 73
67 72 74
我不介意使用熊猫,但我想避免制作额外的数组或使用循环。有什么简单的方法可以做到这一点吗?
解决方案
首先Series.duplicated
仅按列中具有重复项的行进行过滤idx
,然后按列创建索引lvl
,因此可能使用DataFrameGroupBy.idxmax
- 按列的最大值获取索引值:
#create DataFrame from structured array, thanks @SpghttCd
df = pd.DataFrame(struct_arr)
df = df[df['idx'].duplicated(keep=False)].set_index('lvl').groupby('idx').idxmax()
print (df)
start end
idx
60 71 73
67 72 74
通过描述需要idxmin
-start
它返回第一个最小值:
df2 = (df[df['idx'].duplicated(keep=False)]
.set_index('lvl')
.groupby('idx')
.agg({'start':'idxmin', 'end':'idxmax'}))
print (df2)
start end
idx
60 72 73
67 74 74
推荐阅读
- minio - 镜像存储桶时的权限问题,我正在尝试将一个 minio 服务器的存储桶迁移到另一个
- java - Mysql "Select mod(col1, 10) ..." 生成 bigint。如何使其成为int类型
- javascript - 如何设置图像的高度和宽度,以使其适合我在 fabric.js 中的画布大小?
- c - Telnet 拒绝简单 tcp 服务器上的连接
- python - 使用 Python 模拟通过随机创建的方阵的液体流动,该方阵包含一组 0-9 的整数
- xml - rviz 模型被分解成许多部分
- heroku - 使用 CloudFront 进行 Azure AD 身份验证
- vue.js - 根据在 Vuejs 中单击的框 div 显示/隐藏 div。检查图像以更好地理解
- docker - Kubernetes/Docker 使用过多的磁盘空间
- python-3.x - Windows 操作系统中的窗口可以超出屏幕多远