在pandas DataFrame中设置最大值(上限)

elP*_*tor 15 python max dataframe pandas

我正在尝试设置pandas DataFrame列的最大值.例如:

my_dict = {'a':[10,12,15,17,19,20]}
df = pd.DataFrame(my_dict)

df['a'].set_max(15)
Run Code Online (Sandbox Code Playgroud)

会屈服:

    a
0   10
1   12
2   15
3   15
4   15
5   15
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.

有一百万个解决方案可以找到最大值,但没有设置最大值......至少我能找到.

我可以遍历列表,但我怀疑有更快的方法来做大熊猫.我的列表会显着更长,因此我希望迭代需要相对较长的时间.此外,我想要能够处理的任何解决方案NaN.

Psi*_*dom 24

我想你可以这样做:

maxVal = 15
df['a'].where(df['a'] <= maxVal, maxVal)      # where replace values with other when the 
                                              # condition is not satisfied

#0    10
#1    12
#2    15
#3    15
#4    15
#5    15
#Name: a, dtype: int64
Run Code Online (Sandbox Code Playgroud)

要么:

df['a'][df['a'] >= maxVal] = maxVal
Run Code Online (Sandbox Code Playgroud)

  • 如果您不使用 `df.loc[df['a'] &gt;= maxVal, 'a'] = maxVal`,而是使用 `df['a'][df['a'] &gt;= maxVal] = maxVal` 您基本上是在数据帧的副本上设置值,而不是数据帧本身。 (4认同)
  • 注意:两者不相等。第一个也替换为NaN,第二个替换刚刚超过阈值的值(但保持NaN)。 (2认同)
  • 我还要指出,使用`df.loc [df ['a']&gt; = maxVal,'a'] = maxVal`格式可能是更好的做法,但是我没有任何具体的理由为什么要使用它,也没有我比较时间了吗? (2认同)

tom*_*sen 20

你可以使用剪辑.

应用于数据框的所有列:

df.clip(upper=15)
Run Code Online (Sandbox Code Playgroud)

否则,适用于选择列,看到这里:

df.clip(upper=pd.Series({'a': 15}), axis=1)
Run Code Online (Sandbox Code Playgroud)

  • 您是否有理由更喜欢“df.clip(upper=pd.Series({'a': 15}), axis=1)”而不是“df.a.clip(upper=15)”? (2认同)

cs9*_*s95 6

numpy.clip 是一个很好的快速选择。

df

    a
0  10
1  12
2  15
3  17
4  19
5  20

np.clip(df['a'], a_max=15, a_min=None)

0    10
1    12
2    15
3    15
4    15
5    15
Name: a, dtype: int64

# Or,
np.clip(df['a'].to_numpy(), a_max=15, a_min=None)
# array([10, 12, 15, 15, 15, 15])
Run Code Online (Sandbox Code Playgroud)

从v0.21开始,您还可以使用DataFrame.clip_upper

注意:
此方法(连同clip_lower)已从v0.24中弃用,并将在以后的版本中删除。

df.clip_upper(15)
# Or, for a specific column,
df['a'].clip_upper(15)

    a
0  10
1  12
2  15
3  15
4  15
5  15
Run Code Online (Sandbox Code Playgroud)

同样,如果只想设置下限,请使用DataFrame.clip_lower。这些方法在Series对象上也可用。