我有一个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)
另外,我有一个有趣的索引列表,我希望找到一个(或更多)"双胞胎"来自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的原因。它应该消除在结果中包含自身的问题。根据{{3}}我需要另一个论点吗?是否有一个更简单的运算符我没有考虑列表对象及其相应的索引可以完全避免彼此?我在OS 10.10.5上使用Python 2.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']}
答案 0 :(得分:4)
你在将那里的行动链接起来的方式令你感到困惑。应用类似lt
的布尔运算的结果是在每个位置都包含True或False的系列:如果值满足条件则为True,否则为false。由于Python中的True与第一个相同,因此.lt(0.05).gt(0)
中的gt(0)
是无操作。对于所有大于0.05的值,lt
给出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
来应用一次性完成所有过滤的功能。