对标记项目组求和,然后找到最大值

Posted

技术标签:

【中文标题】对标记项目组求和,然后找到最大值【英文标题】:Sum groups of flagged items and then find max values 【发布时间】:2019-05-20 15:31:06 【问题描述】:

我想对按正流和负流分组的值求和,然后比较它们以找出最大的负流和最大的正流。

我认为 itertools 可能是这样做的方法,但无法弄清楚。

#create a data frame that shows week and value
n_rows = 30
dftest = pd.DataFrame('week': pd.date_range('1/4/2019', periods=n_rows, freq='W'),
                      'value': np.random.randint(-100,100,size=(n_rows)))

#flag positives and negatives
def flowFinder(row):
    if row['value'] > 0:
        return "Positive"
    else:
        return "Negative"
dftest['flag'] = dftest.apply(flowFinder,axis=1)
dftest

In this example df,您会确定 15-19 加起来是 249,这是所有正流的最大值。最大负流是第 5 行,-98。

斯科特·波士顿编辑 最好添加生成数据框的代码而不是图片链接。

df = pd.DataFrame('week':pd.date_range('2019-01-06',periods=21, freq='W'), 
                   'value':[64,43,94,-19,3,-98,1,80,-7,-43,45,58,27,29,
                            -4,20,97,30,22,80,-95],
                   'flag':['Positive']*3+['Negative']+['Positive']+['Negative']+
                           ['Positive']*2+['Negative']*2+['Positive']*4+
                           ['Negative']+['Positive']*5+['Negative'])

【问题讨论】:

(dftest.value>0) ? 【参考方案1】:

你可以试试这个:

df.groupby((df['flag'] != df['flag'].shift()).cumsum())['value'].sum().agg(['min','max'])

输出:

min    -98
max    249
Name: value, dtype: int64

使用重命名:

df.groupby((df['flag'] != df['flag'].shift()).cumsum())['value'].sum().agg(['min','max'])\
  .rename(index='min':'Negative','max':'Positive')

输出:

Negative    -98
Positive    249
Name: value, dtype: int64

更新答案评论:

df_out = df.groupby((df['flag'] != df['flag'].shift()).cumsum())['value','week']\
           .agg('value':'sum','week':'last')
df_out.loc[df_out.agg('value':['idxmin','idxmax']).squeeze().tolist()]

输出:

      value       week
flag                  
4       -98 2019-02-10
9       249 2019-05-19

【讨论】:

这是完美的。谢谢你!快速跟进:如何显示最小值和最大值发生的日期? 如果是肯定的,你要哪个日期?计算该数字需要四个日期。 最小的最后日期和最大的最后日期。 这真的很棒而且很完美。渴望继续学习这个。感谢您的帮助@scott-boston

以上是关于对标记项目组求和,然后找到最大值的主要内容,如果未能解决你的问题,请参考以下文章

对列表中每个元素索引的最大值求和 [关闭]

delphi 如何对动态数组求和(INT型),求最大值和最小值

给定一个大小为 N 的数组,我需要找到在最小和最大范围内求和的最小值数

利用stream对list集合中的bigdecimal进行分组求和,均值,最大值,最小值

设计一个数据路径来对三个输入中最大的两个求和

最大联通子数组求和