如何让panda列返回另一列和min_val之间的最小值

时间:2017-05-04 13:47:40

标签: python pandas

我有一个pandas数据框,我想创建一个包含另一列和min_val之间的最小值的列。我在下面创建了简化问题:

import pandas as pd
import numpy as np

min_val = 0.5

np.random.seed(100)
df = pd.DataFrame(np.random.rand(10, 4), columns=['col{0}'.format(i) for i in range(1, 5)])

df['col_4_min'] = df['col4'].apply(lambda x: min(x, min_val))

df
    col1   col2   col3   col4  col_4_min
0 0.7425 0.6302 0.5818 0.0204     0.0204
1 0.2100 0.5447 0.7691 0.2507     0.2507
2 0.2859 0.8524 0.9750 0.8849     0.5000
3 0.3595 0.5989 0.3548 0.3402     0.3402
4 0.1781 0.2377 0.0449 0.5054     0.5000
5 0.3763 0.5928 0.6299 0.1426     0.1426
6 0.9338 0.9464 0.6023 0.3878     0.3878
7 0.3632 0.2043 0.2768 0.2465     0.2465
8 0.1736 0.9666 0.9570 0.5980     0.5000
9 0.7313 0.3404 0.0921 0.4635     0.4635

这个方法的问题是我将对包含非常多行的数据帧执行计算,因此计算需要很快(因此apply在我的情况下并不是真正的特权)< / p>

2 个答案:

答案 0 :(得分:4)

使用np.minimum将标量(或数组)与col

进行比较
In [94]:

min_val = 0.5
df['col_4_min'] = np.minimum(min_val, df['col4'].values)
df
Out[94]:
     col1    col2    col3    col4  col_4_min
0  0.7425  0.6302  0.5818  0.0204     0.0204
1  0.2100  0.5447  0.7691  0.2507     0.2507
2  0.2859  0.8524  0.9750  0.8849     0.5000
3  0.3595  0.5989  0.3548  0.3402     0.3402
4  0.1781  0.2377  0.0449  0.5054     0.5000
5  0.3763  0.5928  0.6299  0.1426     0.1426
6  0.9338  0.9464  0.6023  0.3878     0.3878
7  0.3632  0.2043  0.2768  0.2465     0.2465
8  0.1736  0.9666  0.9570  0.5980     0.5000
9  0.7313  0.3404  0.0921  0.4635     0.4635

感谢@Divakar,调用df['col4'].values会比使用clip更快地提高速度

答案 1 :(得分:4)

使用clip()

df['col_4_min'] = df['col4'].clip(upper=0.5)