如何从Pandas DataFrame中删除连续的一对相反的数字?

发布于 2025-02-06 19:51:14 字数 864 浏览 3 评论 0原文

如何删除与PANDAS DataFrame的相反符号的连续成对相等的对?

假设我有此输入数据框架,

incremental_changes = [2, -2, 2, 1, 4, 5, -5, 7, -6, 6]
df = pd.DataFrame({
    'idx': range(len(incremental_changes)),
    'incremental_changes': incremental_changes
})
   idx  incremental_changes
0    0                    2
1    1                   -2
2    2                    2
3    3                    1
4    4                    4
5    5                    5
6    6                   -5
7    7                    7
8    8                   -6
9    9                    6

我想获得以下

   idx  incremental_changes
0    0                    2
3    3                    1
4    4                    4
7    7                    7

注意:第一个2可以是IDX 0或2,这并不重要。

谢谢

How can i remove consecutive pairs of equal numbers with opposite signs from a Pandas dataframe?

Assuming i have this input dataframe

incremental_changes = [2, -2, 2, 1, 4, 5, -5, 7, -6, 6]
df = pd.DataFrame({
    'idx': range(len(incremental_changes)),
    'incremental_changes': incremental_changes
})
   idx  incremental_changes
0    0                    2
1    1                   -2
2    2                    2
3    3                    1
4    4                    4
5    5                    5
6    6                   -5
7    7                    7
8    8                   -6
9    9                    6

I would like to get the following

   idx  incremental_changes
0    0                    2
3    3                    1
4    4                    4
7    7                    7

Note that the first 2 could either be idx 0 or 2, it doesn't really matter.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝海 2025-02-13 19:51:14

可以分组连续数字并

import itertools

def remove_duplicates(s):
    ''' Generates booleans that indicate when a pair of ints with
        opposite signs are found.
    '''
    iter_ = iter(s)
    for (a,b) in itertools.zip_longest(iter_, iter_):
        if b is None:
            yield False
        else:
            yield a+b == 0
            yield a+b == 0

>>> mask = df.groupby(df['incremental_changes'].abs().diff().ne(0).cumsum()) \
             ['incremental_changes'] \
             .transform(remove_duplicates)

转换

>>> df[~mask]

   idx  incremental_changes
2    2                    2
3    3                    1
4    4                    4
7    7                    7

Can groupby consecutive equal numbers and transform

import itertools

def remove_duplicates(s):
    ''' Generates booleans that indicate when a pair of ints with
        opposite signs are found.
    '''
    iter_ = iter(s)
    for (a,b) in itertools.zip_longest(iter_, iter_):
        if b is None:
            yield False
        else:
            yield a+b == 0
            yield a+b == 0

>>> mask = df.groupby(df['incremental_changes'].abs().diff().ne(0).cumsum()) \
             ['incremental_changes'] \
             .transform(remove_duplicates)

Then

>>> df[~mask]

   idx  incremental_changes
2    2                    2
3    3                    1
4    4                    4
7    7                    7
小糖芽 2025-02-13 19:51:14

只需做滚动,然后我们过滤多个组合

s = df.incremental_changes.rolling(2).sum()
s = s.mask(s[s==0].groupby(s.ne(0).cumsum()).cumcount()==1)==0
df[~(s | s.shift(-1))]
Out[640]: 
   idx  incremental_changes
2    2                    2
3    3                    1
4    4                    4
7    7                    7

Just do rolling, then we filter the multiple combine

s = df.incremental_changes.rolling(2).sum()
s = s.mask(s[s==0].groupby(s.ne(0).cumsum()).cumcount()==1)==0
df[~(s | s.shift(-1))]
Out[640]: 
   idx  incremental_changes
2    2                    2
3    3                    1
4    4                    4
7    7                    7
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文