【问题标题】: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) ?

标签: python pandas numpy itertools


【解决方案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
猜你喜欢
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多