是否有更简单的方法来制作大熊猫。系列单调?

时间:2016-12-06 13:57:54

标签: python pandas numpy

我正在寻找一种快速方法,使x中的pandas数据帧单调。

我目前的解决方案如下:

def make_monotonic(df, cols=None):
    """make df monotonic"""
    if not cols:
        cols = df.columns

    mycol = "_maximum"

    dfm = df.copy()
    for col in cols:
        dfm[mycol] = np.maximum.accumulate(dfm[col])
        dfm.drop_duplicates([mycol], keep="first", inplace=True)
    del dfm[mycol]
    return dfm

n=21
np.random.seed(21)
x = np.linspace(0,np.pi,n)
dx = .5 * (np.random.random(n)-.5)
df = pd.DataFrame.from_dict({"x0":x, "x":x+dx, "y":np.sin(x)})
dfm = make_monotonic(df, cols=["x"])

Make colum x monotonic in "x" Make colum x monotonic in "x"

我想生成一个函数y = f(x)

            x         x0               y
0   -0.676913   0.000000    0.000000e+00
1   -0.002176   0.314159    3.090170e-01
2   0.959768    0.628319    5.877853e-01
3   0.224902    0.942478    8.090170e-01
4   0.815521    1.256637    9.510565e-01
5   0.896956    1.570796    1.000000e+00
6   1.588363    1.884956    9.510565e-01
7   2.444980    2.199115    8.090170e-01
8   2.225446    2.513274    5.877853e-01
9   2.952820    2.827433    3.090170e-01
10  2.495949    3.141593    1.224647e-16

            x         x0           y
0   -0.676913   0.000000    0.000000
1   -0.002176   0.314159    0.309017
2   0.959768    0.628319    0.587785
6   1.588363    1.884956    0.951057
7   2.444980    2.199115    0.809017
9   2.952820    2.827433    0.309017

1 个答案:

答案 0 :(得分:2)

Theres实际上是一种使用df.cummax()执行此操作的简单方法。

cols = ['your', 'columns']
mon_inc = (df[cols].cummax().diff().fillna(.1) > 0).all(axis=1)
df[mon_inc]

下面的旧逻辑:

您可以使用diff方法继续获取行数差异,直到所有值都大于0。

while True:
    mon_inc = df['x'].diff().fillna(0) >= 0
    if mon_inc.all():
        break
    df = df[mon_inc]

并且可以执行任意数量的列

def make_monotonic(df, cols=None):
    if cols is None:
        cols = df.columns

    df1 = df.copy()[cols]

    while True:
        mon_inc = (df1.diff().fillna(0) >= 0).all(axis=1)
        if mon_inc.all():
            break
        df1 = df1[mon_inc]
    return df1