我有一个master_reference对象,它对应于Pandas数据框架中的一个文件,其中包含四列度量。
d = {'one' : pd.Series([1000., 1001., 2000., 3000.], index=['A', 'B', 'C', 'D']),
'two' : pd.Series([1000., 1001., 2000., 3000.], index=['A', 'B', 'C', 'D']),
'three' : pd.Series([1000., 1001., 2000., 3000.], index=['A', 'B', 'C', 'D']),
'four' : pd.Series([1000., 1001., 2000., 3000.], index=['A', 'B', 'C', 'D'])}
master_reference = pd.DataFrame(d)另外,我有一个指数的interesting_list,我希望从master_reference中找到一个(或更多)“双胞胎”。
interesting_list = ['A','B','C']为了实现这一点,我找到了索引和相关的度量标准。
retrieve = master_reference.ix[interesting_list]使用dict理解,我通过master_reference迭代到给定的公差,例如5%。没有匹配和多个匹配就可以了。
matches = {twin_id: master_reference[(master_reference.div(retrieve.ix[twin_id].values) - 1)
.abs()
.lt(0.05)
.gt(0) #why wont this work???
.all(axis=1)].index.tolist()
for twin_id in retrieve.index}
print matches这是我的输出数据:
{'A': ['A', 'B'], 'C': ['C'], 'B': ['A', 'B']}考虑到我5%的容忍度,使用.lt算子,A和B是双胞胎。但是您可以看到,每个字母也找到了自己,这就是为什么.gt运算符在那里确保两个值之间的差值大于0。它应消除将自己纳入结果的问题。根据熊猫文献的说法,我还需要再争论一次吗?有没有一个更简单的操作符,我没有想过,这样列表对象和它相应的索引可以完全避免对方?我在OS10.10.5上使用Python2.7。谢谢你的见解。这个社区是如此巨大的资源。
下面是一些使用.applymap更新的代码:
tolerance = .05
def window(x):
if x > 0 and x <= tolerance:
return x
matches = {twin_id: master_reference[(master_reference.div(retrieve.ix[twin_id].values) - 1)
.abs()
.applymap(window)
.all(axis=1)].index.tolist()
for twin_id in retrieve.index}
print matches为什么我的新输出是这样的?有件简单的事情我错过了!
{'A': ['A', 'B', 'C', 'D'], 'C': ['A', 'B', 'C', 'D'], 'B': ['A', 'B', 'C', 'D']}发布于 2016-01-27 04:53:00
你是在混乱自己的方式,你是链接的操作那里。应用布尔运算(如lt )的结果是在每个位置包含真或假的序列:如果值满足条件,则为True,否则为False。由于Python中的True与数字1相同,所以在类似于.lt(0.05).gt(0)的东西中,gt(0)是没有操作的。lt为所有大于0.05的值提供True,而True大于0(因为True==1),因此gt不过滤任何内容。
您必须复制表达式的第一部分才能完成。
master_reference.div(retrieve.ix[twin_id].values) - 1).abs().lt(0.05) & master_reference.div(retrieve.ix[twin_id].values) - 1).abs().gt(0)或者,不要使用lt和gt,而是使用apply来应用一个函数,该函数可以同时执行所有的筛选。
https://stackoverflow.com/questions/35029083
复制相似问题