对标记项目组求和,然后找到最大值
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 的数组,我需要找到在最小和最大范围内求和的最小值数