将函数/计算应用于熊猫中的多列

时间:2018-07-06 14:21:14

标签: python pandas numpy dataframe

我需要在2列上执行条件计算。规则是一样的。我一直在使用两个函数,并将它们应用于每一列,如下所示。

enter image description here

df = pd.DataFrame({'Min': [50, 50], 
                   'Max' : [150, 150],
                   'Rule': ['A', 'B']})    

def adjust_min(row):
         if row['Rule'] == 'A':
             return row['Min'] * 5
         elif row['Rule'] == 'B':
             return row['Min'] * 10
         else:
             return row['Min']

def adjust_max(row):
     if row['Rule'] == 'A':
         return row['Max'] * 5
     elif row['Rule'] == 'B':
         return row['Max'] * 10
     else:
         return row['Max']

df['Min'] = df.apply(adjust_min, axis=1)

理想情况下,我想要一个适用于两列的函数,也许:

 if row['Rule'] == 'A':
           return row * 5  

有没有更有效的方法?谢谢!

3 个答案:

答案 0 :(得分:1)

Bill's approach应用于您的问题:

import pandas as pd


def multi_func(f_dict):
    def f(row):
        return f_dict[row.name](row)
    return f

df = pd.DataFrame({'Min': [50, 50],
               'Max': [150, 150],
               'Rule': ['A', 'B']}) 
df = df.set_index('Rule')


result = df.apply(multi_func({'A': lambda x: x * 5, 'B': lambda x: x * 10}), axis=1)

导致:

       Max  Min
Rule           
A      750  250
B     1500  500

答案 1 :(得分:1)

矢量化的,您可以将pd.DataFrame.multiply与字典映射一起使用。由于它利用了Pandas数据帧后面的NumPy数组的连续存储块功能,因此效率更高。 pd.DataFrame.apply只是一个薄薄的循环,可以更适当地应用于list而不是数据帧。

df = pd.DataFrame([[50, 150, 'A'],
                   [50, 150, 'B']],
                  columns=['Min', 'Max', 'Rule'])

# define dictionary mapping rule to factor
factors_map = {'A': 5, 'B': 10}

# create series of factors mapped from Rule
factors = df['Rule'].map(factors_map).fillna(1)

# multiply selected columns by factors
cols = ['Min', 'Max']
df[cols] = df[cols].multiply(factors, axis=0)

print(df)

   Min   Max Rule
0  250   750    A
1  500  1500    B

答案 2 :(得分:0)

尝试以下操作:

if row['Rule'] == 'A':
    row[["Min", "Max"]] *= 5
elif row['Rule'] == 'B':
    row[["Min", "Max"]] *= 10

欢呼