在列值和常量全局值之间取最小值

时间:2015-11-13 09:40:38

标签: python numpy pandas dataframe minimum

我想为给定的数据帧创建新列,其中我计算列值与某个全局值之间的最小值(在此示例中为7)。所以我的df有sessionnote列,我想要的输出列是minValue

session     note     minValue
1       0.726841     0.726841
2       3.163402     3.163402  
3       2.844161     2.844161
4       NaN          NaN

我使用内置的Python方法min

df['minValue']=min(7, df['note'])

我有这个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

2 个答案:

答案 0 :(得分:9)

使用np.minimum

In [341]:
df['MinNote'] = np.minimum(1,df['note'])
df

Out[341]:
   session      note  minValue   MinNote
0        1  0.726841  0.726841  0.726841
1        2  3.163402  3.163402  1.000000
2        3  2.844161  2.844161  1.000000
3        4       NaN       NaN       NaN

同样min无法理解类似数组的比较,因此您的错误

答案 1 :(得分:0)

pandas中执行此操作的首选方法是使用Series.clip()方法。

在您的示例中:

import pandas

df = pandas.DataFrame({'session': [1, 2, 3, 4],
                       'note': [0.726841, 3.163402, 2.844161, float('NaN')]})

df['minVaue'] = df['note'].clip(upper=1.)
df

会返回:

       note  session   minVaue
0  0.726841        1  0.726841
1  3.163402        2  1.000000
2  2.844161        3  1.000000
3       NaN        4       NaN

numpy.minimum也可以使用,但是.clip()有一些优点:

  • 更具可读性
  • 您可以同时应用上下限:df['note'].clip(lower=0., upper=10.)
  • 您可以使用其他方法来传递它:df['note'].abs().clip(upper=1.).round()