首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas DataFrame中的DataFrame算子

Pandas DataFrame中的DataFrame算子
EN

Stack Overflow用户
提问于 2016-01-27 04:45:38
回答 1查看 2.3K关注 0票数 1

我有一个master_reference对象,它对应于Pandas数据框架中的一个文件,其中包含四列度量。

代码语言:javascript
复制
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中找到一个(或更多)“双胞胎”。

代码语言:javascript
复制
interesting_list = ['A','B','C']

为了实现这一点,我找到了索引和相关的度量标准。

代码语言:javascript
复制
retrieve = master_reference.ix[interesting_list]

使用dict理解,我通过master_reference迭代到给定的公差,例如5%。没有匹配和多个匹配就可以了。

代码语言:javascript
复制
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

这是我的输出数据:

代码语言:javascript
复制
{'A': ['A', 'B'], 'C': ['C'], 'B': ['A', 'B']}

考虑到我5%的容忍度,使用.lt算子,A和B是双胞胎。但是您可以看到,每个字母也找到了自己,这就是为什么.gt运算符在那里确保两个值之间的差值大于0。它应消除将自己纳入结果的问题。根据熊猫文献的说法,我还需要再争论一次吗?有没有一个更简单的操作符,我没有想过,这样列表对象和它相应的索引可以完全避免对方?我在OS10.10.5上使用Python2.7。谢谢你的见解。这个社区是如此巨大的资源。

下面是一些使用.applymap更新的代码:

代码语言:javascript
复制
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

为什么我的新输出是这样的?有件简单的事情我错过了!

代码语言:javascript
复制
{'A': ['A', 'B', 'C', 'D'], 'C': ['A', 'B', 'C', 'D'], 'B': ['A', 'B', 'C', 'D']}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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不过滤任何内容。

您必须复制表达式的第一部分才能完成。

代码语言:javascript
复制
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)

或者,不要使用ltgt,而是使用apply来应用一个函数,该函数可以同时执行所有的筛选。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35029083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档