【问题标题】:Set maximum value (upper bound) in pandas DataFrame在 pandas DataFrame 中设置最大值(上限)
【发布时间】:2019-06-05 03:44:31
【问题描述】:

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

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

df['a'].set_max(15)

会产生:

    a
0   10
1   12
2   15
3   15
4   15
5   15

但事实并非如此。

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

我可以遍历列表,但我怀疑有一种更快的方法可以使用 pandas 来完成。我的列表会更长,因此我预计迭代会花费相对更长的时间。另外,我想要任何能够处理NaN 的解决方案。

【问题讨论】:

    标签: python pandas dataframe max


    【解决方案1】:

    您可以使用clip

    应用于数据框的所有列:

    df.clip(upper=15)
    

    否则将应用于所选列,如here

    df.clip(upper=pd.Series({'a': 15}), axis=1)
    

    【讨论】:

    • 有什么理由让你更喜欢df.clip(upper=pd.Series({'a': 15}), axis=1)而不是df.a.clip(upper=15)
    • @Hestaron One 是特定于列的。另一个不是。如果您只有一列,则无需指定列。
    【解决方案2】:

    我想你可以这样做:

    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
    

    或者:

    df['a'][df['a'] >= maxVal] = maxVal
    

    【讨论】:

    • 就是这样。知道我缺少一些简单的东西。谢谢 Psidom。
    • 注意:两者不等价。第一个也替换 NaN,第二个只是高于阈值的值(但保留 NaN)。
    • 我还要注意,使用 df.loc[df['a'] &gt;= maxVal, 'a'] = maxVal 格式可能是更好的做法,但我没有任何具体的理由首选它,也没有比较时间。
    • 如果你不使用df.loc[df['a'] &gt;= maxVal, 'a'] = maxVal,而是使用df['a'][df['a'] &gt;= maxVal] = maxVal,你基本上是在数据帧的副本上设置值,而不是数据帧本身。
    【解决方案3】:

    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])
    

    从 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
    

    类似地,如果您只想设置下限,请使用DataFrame.clip_lower。这些方法也可用于Series 对象。

    【讨论】:

    猜你喜欢
    • 2018-06-01
    • 2015-08-11
    • 2018-08-02
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多