gpt4 book ai didi

python - 有没有更简单的方法来使 pandas.Series 单调?

转载 作者:行者123 更新时间:2023-11-30 22:46:04 29 4
gpt4 key购买 nike

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

我当前的解决方案如下:

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

最佳答案

实际上有一种非常简单的方法可以使用 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

关于python - 有没有更简单的方法来使 pandas.Series 单调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997089/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com