Суммируйте группы помеченных элементов и затем найдите максимальные значения - PullRequest
3 голосов
/ 20 мая 2019

Я хотел бы суммировать значения, сгруппированные по положительным и отрицательным потокам, а затем сравнить их, чтобы вычислить самые большие отрицательные и самые большие положительные потоки.

Я думаю, что 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

В этом примере 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']})

1 Ответ

1 голос
/ 20 мая 2019

Вы можете попробовать это:

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
...