在Python中将列的值限制为+100%

s4n0splo  于 2023-02-28  发布在  Python
关注(0)|答案(3)|浏览(171)

df中的列的值应限制为+100%
电流输出:

var1  var2   var3    var4
140%  475%   895%   16249%
337% -100%  -100%    -100%
173%  -95%  5165%     454%
458%   18%   354%    -100%
483%  -73%  6962%    -100%
147%   18%  -100%    -100%

期望输出

var1  var2   var3    var4
100%  100%   100%     100%
100% -100%  -100%    -100%
100%  -95%   100%     100%
100%   18%   100%    -100%
100%  -73%   100%    -100%
100%   18%  -100%    -100%

所以每列中高于100%的值都应该替换为100%,我不知道怎么做
EDIT:数据不是字符串,但以前看起来像这样:
先前输出:

var1  var2   var3    var4
1.40  4.75   8.95   162.49
3.37 -1.00  -1.00    -1.00
1.73 -0.95  51.65     4.54
4.58  0.18   3.54    -1.00
4.83 -0.73  69.62    -1.00
1.47  0.18  -1.00    -1.00

我在上面应用了这个:

df = df.style.format({'var1': '{:.0%}','var2': '{:.0%}', 'var3': '{:.0%}','var4': '{:.0%}'})

因为我需要以%为单位的数字作为最终输出
非常抱歉没有提供足够的信息,非常感谢您的帮助@user19077881

hgtggwj0

hgtggwj01#

要将numpy clip应用于DataFrame df,并将%值作为字符串,可以用途:

def clip_it(x):
    try:
        n = x.replace('%', '')
        n = np.clip(int(n), -100, 100)
        return str(n)+'%'
    except ValueError:
        return x

df = df.应用Map(剪辑_it)

df = pd.DataFrame({'x': ['100%', '-200%', '57%'],
                   'y': [ '45%', '167%', '-23%']})

它给出了

x     y
0   100%   45%
1  -100%  100%
2    57%  -23%
fykwrbwg

fykwrbwg2#

如果你想把你的数据剪辑到-100%, 100%,你应该在样式化之前完成它。因为你的样式器基本上是乘以100并添加一个“%”字符,所以你的样式化数据中的-100%, 100%剪辑等价于你的原始数据中的-1.0, 1.0剪辑。

df = df.apply(lambda x: np.clip(x, -1, 1))
df

    var1    var2    var3    var4
0   1.0     1.00    1.0    1.0
1   1.0    -1.00   -1.0   -1.0
2   1.0    -0.95    1.0    1.0
3   1.0     0.18    1.0   -1.0
4   1.0    -0.73    1.0   -1.0
5   1.0     0.18   -1.0   -1.0

df.style.format({'var1': '{:.0%}','var2': '{:.0%}', 'var3': '{:.0%}','var4': '{:.0%}'})

    var1    var2    var3    var4
0   100%    100%    100%    100%
1   100%   -100%   -100%   -100%
2   100%   -95%     100%    100%
3   100%    18%     100%   -100%
4   100%   -73%     100%   -100%
5   100%    18%    -100%   -100%

然而,我想知道你是否真的需要像你的例子所建议的那样“裁剪”你的数据,或者你是否想相对于每列中的最大值和最小值来缩放它。如果你裁剪它,你会丢失162.49和4.54之间的差值,两者都变成了100%。通过缩放它,你可以在保持相对距离的同时将它保持在所需的范围内。
基于this answer,您可以

def scaler(data):
    top, bottom = 1, -1
    minimum, maximum = data.min(), data.max()
    return (data - maximum) / (minimum - maximum) * (bottom - top) + top

df = df.apply(scaler)
df

    var1    var2    var3    var4
0  -1.000000    1.000000   -0.718210    1.000000
1   0.148688   -1.000000   -1.000000   -1.000000
2  -0.807580   -0.982609    0.491079   -0.932228
3   0.854227   -0.589565   -0.871425   -1.000000
4   1.000000   -0.906087    1.000000   -1.000000
5  -0.959184   -0.589565   -1.000000   -1.000000

df.style.format({'var1': '{:.0%}','var2': '{:.0%}', 'var3': '{:.0%}','var4': '{:.0%}'})

    var1    var2    var3    var4
0  -100%    100%    -72%    100%
1    15%   -100%   -100%   -100%
2   -81%    -98%     49%    -93%
3    85%    -59%    -87%   -100%
4   100%    -91%    100%   -100%
5   -96%    -59%   -100%   -100%

当然,由于这是基于每列的最大值和最小值进行缩放,因此在-1.0, 1.0上裁剪时,缩放后的数据的0不会与原始数据的0对应,例如在var4列中,4.54变为-93%,因为它非常接近最小值。您可以修改前面的函数,以便在缩放时使用最大绝对值:

def scaler_abs(data):
    top, bottom = 1, -1
    max_abs = max([data.min(), data.max()], key=abs)
    minimum, maximum = -max_abs, max_abs
    return (data - maximum) / (minimum - maximum) * (bottom - top) + top

df = df.apply(scaler_abs)
df

    var1    var2    var3    var4
0   0.289855    1.000000    0.128555    1.000000
1   0.697723   -0.210526   -0.014364   -0.006154
2   0.358178   -0.200000    0.741885    0.027940
3   0.948240    0.037895    0.050847   -0.006154
4   1.000000   -0.153684    1.000000   -0.006154
5   0.304348    0.037895   -0.014364   -0.006154

df.style.format({'var1': '{:.0%}','var2': '{:.0%}', 'var3': '{:.0%}','var4': '{:.0%}'})

    var1    var2    var3    var4
0   29%     100%     13%     100%
1   70%     -21%     -1%      -1%
2   36%     -20%     74%       3%
3   95%       4%      5%      -1%
4   100%    -15%    100%      -1%
5   30%       4%     -1%      -1%
cetgtptt

cetgtptt3#

您可以使用numpy.clip来设置范围最小值或最大值以外的值,请考虑以下简单示例

import numpy as np
arr = np.array([[-500,-300,-100],[0,50,150]])
arr2 = np.clip(arr, -100, 100)
print(arr2)

给出输出

[[-100 -100 -100]
 [   0   50  100]]

相关问题