【问题标题】:Pandas: compute oriented distance to the next truePandas:计算到下一个真实的定向距离
【发布时间】:2018-10-14 18:21:46
【问题描述】:

我在 pandas 数据框中有一系列真/假,我想将此列转换为具有 False 负值、true 正值并在真假之间插入 0 的宏。 在我的代码中插入零应该是可选的。

那么当与下一个转换真/假的距离增加时,值应该增加-1或+1。

我正在讨论如何用干净的 python 代码编写这个。

16/10/18:我在帖子末尾添加了一个新示例,该示例因当前答案而失败。

所以这个:

0 False 
1 False
2 False
3 False
4 True
5 True
6 True
7 True
8 True 
9 True 
10 False
11 False 
12 False 
13 False 
14 False 
15 True 
16 True 
17 True 
18 True 
19 True 
20 False

会给出:

0 False=> -4
1 False=> -3
2 False=> -2
3 False=> -1
=>0  
4 True =>+1
5 True => +2
6 True=> +3
7 True=> +3
8 True => +2
9 True => +1
=>0
10 False =>-1
11 False => -2
12 False => -3
13 False =>-2
14 False => -1
=>0
15 True =>+1
16 True =>+2
17 True =>+3
18 True =>+2
19 True =>+1
=>0
20 False=>-1

这是另一个例子: 例如这里

False
False
False
False
True
True
True
True
True
True
True
True
True
True
False
False
False
False
False
False
False
False
False
False`

应该给出:

0     -4
1     -3
2     -2
3     -1
4      1
5      2
6      3
7      4
8      5
9      5
10     4
11     3
12     2
13     1
14    -1
15    -2
16    -3
17    -4
18    -5
19    -6
20    -7
21    -8
22    -9
23    -10

我的问题与这个问题非常相似:How to count distance to the previous zero in pandas series?

非常感谢您分享您的知识。

编辑:来自 RafaelC 的答案不起作用,因为它在第二个示例中给出了以下结果:

0     -4
1     -3
2     -2
3     -1
4      1
5      2
6      3
7      4
8      5
9      5
10     4
11     3
12     2
13     1
14   -10
15    -9
16    -8
17    -7
18    -6
19    -5
20    -4
21    -3
22    -2
23    -1

在索引 14 处,它给出 -10 而不是 -1

编辑/编辑: RaphaelC 的最后一个答案在这种情况下不起作用:

False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
True
True
True
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False
False

函数返回错误:

~/anaconda3/lib/python3.6/site-packages/pandas/core/groupby/groupby.py in transform(self, func, *args, **kwargs)
   3659 
   3660             indexer = self._get_index(name)
-> 3661             s = klass(res, indexer)
   3662             results.append(s)
   3663 

~/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in __init__(self, data, index, dtype, name, copy, fastpath)
    259                             'Length of passed values is {val}, '
    260                             'index implies {ind}'
--> 261                             .format(val=len(data), ind=len(index)))
    262                 except TypeError:
    263                     pass

ValueError: Length of passed values is 2, index implies 3

我不明白为什么。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    因此,根据定义,如果值在数据框的中间,则它们将是一个渐变,如果它们是第一组或最后一组,则只是一个反向范围。

    g = df.groupby((df.col != df.col.shift()).cumsum())
    n_groups = len(g)
    
    def f(s):
        n = len(s)//2
        t = s.all().all()
        if s.name == 1:
            x = list(range(len(s), 0, -1))
        elif s.name == n_groups:
            x = list(range(1, len(s)+1))
        else:
            x = list(range(1,n+1)) + list(range(n if n!=1 else n+1,0,-1))
            if n%2 == 0: x.insert(n,n+1)
        return pd.Series(x) * (1 if t else -1)
    
    g['col'].transform(f).reset_index(drop=True)
    

    产量

    0    -4
    1    -3
    2    -2
    3    -1
    4     1
    5     2
    6     3
    7     3
    8     2
    9     1
    10   -1
    11   -2
    12   -3
    13   -2
    14   -1
    15    1
    16    2
    17    3
    18    2
    19    1
    20   -1
    

    0     -4
    1     -3
    2     -2
    3     -1
    4      1
    5      2
    6      3
    7      4
    8      5
    9      5
    10     4
    11     3
    12     2
    13     1
    14    -1
    15    -2
    16    -3
    17    -4
    18    -5
    19    -6
    20    -7
    21    -8
    22    -9
    23   -10
    

    【讨论】:

    • 非常感谢您的回答。不幸的是,它没有按预期工作。我添加了第二个示例,上面的代码失败了。也许我的问题不是很清楚。对此感到抱歉
    • @tommy123 这只是一个需要修复的小细节。查看编辑后的代码
    • 非常感谢您的宝贵时间,非常感谢。
    猜你喜欢
    • 2020-07-29
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多