这是对这个已接受答案的扩展。
我的数据框:
import pandas as pd
df = pd.DataFrame(
{
'a': [-3, -1, -2, -5, 10, -3, -13, -3, -2, 1, 2, -100],
'b': [1, 2, 3, 4, 5, 10, 80, 90, 100, 99, 1, 12]
}
)
预期输出:
a b
5 -3 10
6 -13 80
7 -3 90
8 -2 100
逻辑:
a) 选择中最长的一串负片a
。
b) 例如,如果有两个条纹具有相同的大小,我想要一个总和更大的条纹b
。df
有两个条纹的大小为 4,但我想要第二个,因为总和b
更大。
我的尝试:
import numpy as np
s = np.sign(df['a'])
df['g'] = s.ne(s.shift()).cumsum()
df['size'] = df.groupby('g')['g'].transform('size')
df['b_sum'] = df.groupby('g')['b'].transform('sum')
代码
出去:
您可以保留相同的逻辑,只需添加一个额外的过滤步骤(例如
query
)以获取所有最大尺寸,然后获取idxmax
“b”的总和:输出:
中间的:
或者,使用您的方法(请注意,如果两个或多个具有最大长度和相同的 b 和,则这不能保证唯一的组):