【发布时间】:2015-09-14 22:56:29
【问题描述】:
我有一个名为 bom2 的表(大约 74k 行 + 其他列,但我们只对组装和完成产品感兴趣。为了澄清一点,相同的组装和完成产品 ID 可以出现在两列中。
bom2=pd.DataFrame({'Assembly': {0: '0138104116',
1: '0309005994',
2: '0309005996',
3: '0309005998',
4: '0309005998',
5: '0309005998',
6: '0309005998',
7: '0312005996',
8: '0312005997',
9: '0312005998'},
'Finish product': {0: '0138104116',
1: '0309005994',
2: '0309005996',
3: '0309005998',
4: '0309005998',
5: '0309005998',
6: '0309005998',
7: '0312005996',
8: '0312005997',
9: '0312005998'}})
我需要:
获取所有程序集 ID
与完成产品 ID 比较
只取 Finish product 在 Assembly 列中的任何位置都没有其 ID 的行。
方法一:
nejsou = bom2[-bom2['Finish product'].isin(bom2.Assembly.tolist())]
方法二:
ass = bom2.Assembly.tolist()
fin = bom2['Finish product'].tolist()
nee=list() #will contain Assembly IDs which do not occur in 'Finish product'
for a in ass:
if a not in fin: nee.append(a)
在下一步中,使用 'nee' 中的 ID 来搜索相应的行
bom2[bom2.Assembly.isin(nee)]
我原以为这两种方法是等效的,但是当我检查每种方法产生的程序集 ID 的数量时,我得到的数字不同。
print "method(1 + 2):", len(set(nejsou.Assembly.tolist()+nee)), "Unique Assembly IDs"
print "method(1):",len(set(nejsou.Assembly.tolist())), "Unique Assembly IDs"
print "method(2):",len(set(nee)), "Unique Assembly IDs"
method(1 + 2): 4021 Unique Assembly IDs
method(1): 4015 Unique Assembly IDs
method(2): 1986 Unique Assembly IDs
似乎方法 1(布尔过滤)捕获了方法 2 捕获的所有案例 + 大约 2k 其他案例,我无法弄清楚这些案例是什么。
这两种方法有何不同? 有没有其他方法可以达到预期的效果?
【问题讨论】:
-
在
bom2[-...]中,减号是故意的吗?如果是这样,你的意思是什么? -
是的,减号或者 ~ 充当逻辑非(否定),所以 -True == False 和 -False == True 如stackoverflow.com/questions/14057007/remove-rows-not-isinx
-
有趣。我一直使用
~,但不知道-做同样的事情。谢谢。