Pandas:如何使用函数字典根据其他列之间的计算分配列值

时间:2017-11-19 05:22:24

标签: python pandas dictionary

使用以下Pandas DataFrame,我将如何创建一个新列,"花费"例如,基于另一列中的函数名称?

示例数据集

  cost method  metric  rate  total planned
0        CPMV    2000   100           1000
1        CPMV    4000   100           1000
2        Flat       0     0           1000
3        Flat       0     0              0
4        Free       1     2              3

我需要根据成本法计算成本。

  • CPMV: df.metric / 1000 * df.rate
  • Flat: df.total planned / variableLength< - 变量
  • 免费:0< - 返回0

1 个答案:

答案 0 :(得分:1)

这可以通过首先设置功能字典来实现。键将是计算的名称和值。然后,在apply函数中使用lambda,您可以通过选择成本方法来确定要使用哪个键的函数。

  1. 创建一个接受数据框和列名作为参数的函数。
  2. 在函数中,使用您希望函数关联的成本方法名称作为键来编写字典。值是列名参数。
  3. 为费用方法创建一个选择器。
  4. 使用get返回函数值或“not in dict”。
  5. 使用内部的lalmbda函数来使用该方法。
  6.   

    使用safe_div函数计算flight_length为0将返回total_planned而不是错误。

    # make safe_div
    def safe_div(x,y):
        if y == 0:
            return x
        return x / y
    
    # write the dictionary
    def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col):
        calculations = {
                'CPMV'  : df_name[metric_col] / 1000 * df_name[rate_col],
                'Flat'  : safe_div(df_name[total_planned_col], flight_week_diff),
                'Free'  : 0
                }
        df_method = df_name[cost_method_col]
        return calculations.get(df_method, "not in dict")
    
    # call the function inside a lambda
    test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
    row,
    cost_method_col='cost method',
    metric_col='metric',
    rate_col='rate',
    total_planned_col='total planned'), axis = 1)
    
      cost method  metric  rate  total planned  spend
    0        CPMV    2000   100           1000  200.0
    1        CPMV    4000   100           1000  400.0
    2        Flat       0     0           1000  500.0
    3        Flat       0     0              0    0.0
    4        Free       1     2              3    0.0