数据测试 关于 python 数组筛选的问题

Alpha · 2017年12月18日 · 最后由 Alpha 回复于 2017年12月19日 · 1440 次阅读

a = np.array([['项目A','薛之谦','费用1',200],
                      ['项目A','薛之谦','费用2',100],
                      ['项目B','薛之谦','费用3',300],
                      ['项目C','张韶涵','费用4',600],
                      ['项目C','张韶涵','费用5',300]])


b = np.array([['项目A',2000,3000],
                    ['项目B',5000,2000],
                    ['项目C',3000,1000]])

# 需求:
# 1、需要从a中取出薛之谦的所有项目:项目A和项目B
# 2、从b中根据"a_project",将b中包含有"a_project"的列的后两列累加,即:2000+3000+5000+2000

# 实现:
# 1、
a_project = np.unique(a[a[:,1] == '薛之谦',:][:,0]) #['项目A' '项目B']

# 2、


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 6 条回复 时间 点赞

第 2 点如何实现?

np.where(np.in1d(b[:,0],a_project),np.sum(b[:,1:].astype('float'),axis=1),0).sum()

1 将第一列拿出来,然后跟 a_project 比较不同

scondition=np.in1d(b[:,0],a_project)
#      [ True  True False]

2 然后将 b 的后两列 相加

data=np.sum(b[:,1:].astype('float'),axis=1)
#    [ 5000. 7000. 4000.]

3 筛选并求和

np.where(scondition,data,0).sum()

缺点:
效率不是太好

rywu 回复

😁 你这个有点霸王硬上弓的意思啊...

rywu 回复

这样可以省去一个 where...哈哈哈,是不是更便于理解

b[np.in1d(b[:, 0], a_project)][:, 1:3].astype(np.float).sum(axis=1).sum()

#4 楼 @yoyoalphax
是不是还可以简写
b[np.in1d(b[:,0],a_project),1:].astype('float').sum()

—— 来自 TesterHome 官方 安卓客户端

6楼 已删除
rywu 回复

哈哈!对!!!

Alpha 关闭了讨论 03月01日 00:01
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册