首页 > 解决方案 > 如何在某些条件下制作一个 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

我不介意使用熊猫,但我想避免制作额外的数组或使用循环。有什么简单的方法可以做到这一点吗?

标签: pythonpandasnumpy

解决方案


首先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

推荐阅读