参考Pandas SeriesGroupBy中的先前组

问题描述 投票:0回答:1

我正在编写一个Python脚本,用于比较每个组的最大值。我认为必须有更美妙的方法使用pandas提供的方法或不使用全局变量,如previous_max在下面的代码片段中。请告诉我怎么做。

import pandas as pd
import numpy as np

previous_max = 0

def f(x):
    global previous_max
    if x.max() >= previous_max:
        previous_max = x.max()
        return "ascending"
    else:
        previous_max = x.max()
        return "descending"

df = pd.DataFrame({
    'date': pd.date_range('2000-1-1', periods=100, freq='D'),
    'val': np.random.random(100)
    })

df['trend'] = df.groupby(pd.TimeGrouper(key='date', freq='10D'))['val'].transform(f)
python pandas pandas-groupby
1个回答
0
投票

使用:


np.random.seed(456) 

previous_max = 0

def f(x):
    global previous_max
    if x.max() >= previous_max:
        previous_max = x.max()
        return "ascending"
    else:
        previous_max = x.max()
        return "descending"

df = pd.DataFrame({
    'date': pd.date_range('2000-1-1', periods=30, freq='D'),
    'val': np.random.random(30)
    })

df['trend1'] = df.groupby(pd.TimeGrouper(key='date', freq='3D'))['val'].transform(f)

g = df.groupby(pd.TimeGrouper(key='date', freq='3D'))
df['trend'] = g['val'].transform('max').diff().lt(0)
df['trend'] = np.where(g['trend'].transform('any'), 'descending','ascending')

print (df)
         date       val      trend1       trend
0  2000-01-01  0.248756   ascending   ascending
1  2000-01-02  0.163067   ascending   ascending
2  2000-01-03  0.783643   ascending   ascending
3  2000-01-04  0.808523   ascending   ascending
4  2000-01-05  0.625628   ascending   ascending
5  2000-01-06  0.604114   ascending   ascending
6  2000-01-07  0.885702   ascending   ascending
7  2000-01-08  0.759117   ascending   ascending
8  2000-01-09  0.181105   ascending   ascending
9  2000-01-10  0.150169  descending  descending
10 2000-01-11  0.435679  descending  descending
11 2000-01-12  0.385273  descending  descending
12 2000-01-13  0.575710   ascending   ascending
13 2000-01-14  0.146091   ascending   ascending
14 2000-01-15  0.686593   ascending   ascending
15 2000-01-16  0.468804  descending  descending
16 2000-01-17  0.569999  descending  descending
17 2000-01-18  0.645701  descending  descending
18 2000-01-19  0.723341   ascending   ascending
19 2000-01-20  0.680671   ascending   ascending
20 2000-01-21  0.180917   ascending   ascending
21 2000-01-22  0.118158  descending  descending
22 2000-01-23  0.242734  descending  descending
23 2000-01-24  0.008183  descending  descending
24 2000-01-25  0.360068   ascending   ascending
25 2000-01-26  0.146042   ascending   ascending
26 2000-01-27  0.542723   ascending   ascending
27 2000-01-28  0.857103   ascending   ascending
28 2000-01-29  0.200212   ascending   ascending
29 2000-01-30  0.134633   ascending   ascending
© www.soinside.com 2019 - 2024. All rights reserved.