【问题标题】:Get the min of [0, x] element wise for a column获取列的 [0, x] 元素的最小值
【发布时间】:2015-08-14 22:08:13
【问题描述】:

我需要计算一个列,其中的值是对其他列进行矢量化操作的结果:

df["new_col"] = df["col1"] - min(0,df["col2"])

然而,事实证明,我不能像上面的语法那样使用 min 。那么,获得零和熊猫列的给定值之间的最小值的正确方法是什么?

【问题讨论】:

  • 汤姆的回答看起来不错。在列上,您也可以使用.map( lambda x: min(x,0) ) 将标准python min 应用于每个单元格,但np.minimum 可能是最快的方法。

标签: python pandas


【解决方案1】:

您可以使用numpy.minimum 来查找数组的元素最小值

import numpy as np
df["new_col"] = df["col1"] - np.minimum(0,df["col2"])

【讨论】:

    【解决方案2】:

    您可以使用一些掩码和一个临时列。完全忽略了'min'函数。

    magicnumber = 0
    tempcol = df['col2']
    mask = tempcol < magicnumber
    tempcol.loc[df[~mask].index] = magicnumber
    df['col1'] - tempcol
    

    或者您可以使用 lambda 函数:

    magicnumber = 0
    df['col1'] - df['col2'].apply(lambda x: np.min(magicnumber, x))
    

    或者您可以应用两列:

    df['magicnumber'] = 0
    df['col1'] - df[['col2', 'magicnumber']].apply(np.min, axis=1)
    

    【讨论】:

    • @ajcr 是的,我问错了。今天太热了。我用实际问题的解决方案更新了我的答案。
    【解决方案3】:

    我认为其他答案不是您的意思。他们取df['col2'] 中的最小值并将其与0 进行比较(因此总是返回相同的值),而您想要col20 中的每个值之间的最小值:

    df = pd.DataFrame(data={'a': [2, 3], 'b': [-1, 1]})
    
    df['new_col'] = map(lambda a, b: a - min(0, b), df['a'], df['b'])
    
    print df
    
    >>    a  b  new_col
       0  2 -1        3
       1  3  1        3
    

    【讨论】:

    • np.minimum 确实 返回元素最小值 0 和 col2 中的值;它不会“总是返回相同的值”
    • (正如汤姆所说,np.minimum 正是这样做的)。此外,还有一点:您的代码与输出 DataFrame 不同。
    猜你喜欢
    • 2014-07-23
    • 2018-07-07
    • 1970-01-01
    • 2017-05-14
    • 2012-11-17
    • 2018-06-18
    • 2011-05-11
    • 2018-03-03
    • 1970-01-01
    相关资源
    最近更新 更多