这是这post的延伸.

我的数据帧是:

import pandas as pd

df = pd.DataFrame(
    {
        'a': [
            'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
            'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b',
        ],
        'b': [
            -20, 20, 20, 20,-70, -70, 10, -1000, -10, 100, 100,
            -11, -100, -1, -1, -100, 100, 1, 90, -1, -2, 1000, 900
        ],
        'c': [
            'f', 'f', 'f', 'f', 'f', 'x', 'x', 'x', 'y', 'y', 'y', 'a',
            'k', 'k', 'k', 'k', 'k', 't', 't', 't', 't', 's', 'e',
        ],
    }
)

这就是我想要的输出.我想要一个有六列的数据帧:

a  direction  length   sum      start       end
a         -1       2 -1010       x           y
a          1       3    60       f           f
b         -1       4  -202       k           k
b          1       3   191       k           t

我想要获得列b中针对列a中的每个组的最大正负条纹,并在此之后将列b的值相加.这个问题已经解决了here个.在上面注明的帖子中,我更详细地解释了这个问题.

现在我想补充的是:在找到b中最长的正负条纹的总和后,我需要这些条纹第c列的起始值和结束值.

在这张图中,我突出显示了拥有最长连胜纪录的组:

enter image description here

我试过的是:

df['sign'] = np.sign(df.b)
group = df['sign'].ne(df['sign'].shift()).cumsum()

out = (df
   .assign(direction=np.sign(df['b']))
   .groupby(['a', 'direction', group], as_index=False)
   .agg(length=('b', 'count'),
        sum=('b', 'sum'))
   .sort_values(by='sum', key=abs, ascending=False)
   .loc[lambda d: d.groupby(['a', 'direction'])['length'].idxmax(),
        ['a','direction', 'length', 'sum']]
)

df['streak'] = df['sign'].ne(df['sign'].shift()).cumsum()
df['length'] = df.groupby('streak')['b'].transform('size')
df['sum'] = df.groupby('streak', as_index=False)['b'].transform(sum)
dfm = df.merge(out, on=['a', 'length', 'sum'], how='inner')

它正在接近,但感觉这不是做这件事的方式.

推荐答案

first/lastagg中添加额外的聚合:

out = (df
   .assign(direction=np.sign(df['b']))
   .groupby(['a', 'direction', group], as_index=False)
   .agg(length=('b', 'count'),
        sum=('b', 'sum'),
        start=('c', 'first'),
        end=('c', 'last'))
   .sort_values(by='sum', key=abs, ascending=False)
   .loc[lambda d: d.groupby(['a', 'direction'])['length'].idxmax()]
)

输出:

   a  direction  length   sum start end
2  a         -1       2 -1010     x   y
4  a          1       3    60     f   f
7  b         -1       4  -202     k   k
9  b          1       3   191     k   t

Python相关问答推荐

有没有方法可以关闭Python多处理资源跟踪器进程?

Python(Polars):使用之前的变量确定当前解决方案的Vector化操作

Django注释:将时差转换为小数或小数

如何观察cv2.erode()的中间过程?

如何使用bs 4从元素中提取文本

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

Python -根据另一个数据框中的列编辑和替换数据框中的列值

acme错误-Veritas错误:模块收件箱没有属性linear_util'

numba jitClass,记录类型为字符串

重新匹配{ }中包含的文本,其中文本可能包含{{var}

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

无法通过python-jira访问jira工作日志(log)中的 comments

优化pytorch函数以消除for循环

如何获取TFIDF Transformer中的值?

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

Python虚拟环境的轻量级使用

迭代嵌套字典的值

Django admin Csrf令牌未设置

Tkinter菜单自发添加额外项目

如何使用使用来自其他列的值的公式更新一个rabrame列?