基于另一列对熊猫数据框应用不同的功能

时间:2021-07-08 10:51:42

标签: python pandas dataframe

我有一个数据框,有两列。我正在尝试根据数据框中的数字创建第三列。如果 b 列中的数字为正数,我希望 C 列等于 a * b 列

如果 b 列中的数字为负数,我希望 c 列等于 a * b * 0.95 列。

我想得到的一个例子:

col_a col_b col_c
100.    1.   100
100.    -1.  -95
100.    10.  1000
100.    -10.  -950


I have currently tried this:


def profit_calculation(value):

    if value<0:
        return(a * b * 0.95)
    else:
        return(a * b) 

df['col_c']=df['col_b'].apply(profit_calculation)

但这似乎是不正确的。

3 个答案:

答案 0 :(得分:1)

df = pd.DataFrame({"a": [100, 100, 100, 100],
                   "b": [1, -1, 10, -10]})

df.a * df.b * (1 - 0.05 * (df.b < 0))

# out:
0     100.0
1     -95.0
2    1000.0
3    -950.0

说明:当与浮点数 0.05 相乘时,布尔系列 (df.b < 0) 被强制转换为整数 (True=1, False=0),因此我们在所有负 b 的情况下从 1 中减去 0.05,因此在以下情况下获得 0.95我们需要它。

答案 1 :(得分:0)

您可以使用 np.where 并使用 gt 检查 b 列是否大于 0:

import numpy as np
import pandas as pd

a_b =  df.col_a.mul(df.col_b)
df['col_c'] = np.where(df['col_b'].gt(0), a_b, a_b.mul(0.95))

打印:

>>> df

   col_a  col_b   col_c
0    100      1   100.0
1    100     -1   -95.0
2    100     10  1000.0
3    100    -10  -950.0

答案 2 :(得分:0)

您可以使用 lambda 函数根据数据帧中的数据创建新数据 (df) 请参阅此处对 lambda 函数的说明 => https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html 它接受数据帧中的一行参数并返回所做的更新因此对于每一行,我们调用利润_计算,并为它提供与参数中的行相对应的数据。 所以你必须替换为

def profit_calculation(value):
  return value["col_b"]*value["col_a"] if value["col_b"] > 0 else value["col_b"]*value["col_a"]*.95  

df['col_c']=df.apply(lambda value: profit_calculation(value), axis=1)