首页 > 解决方案 > 将函数/计算应用于熊猫中的多个列

问题描述

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

在此处输入图像描述

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  

有没有更有效的方法来做到这一点?谢谢!

标签: pythonpandasnumpydataframe

解决方案


向量化,您可以pd.DataFrame.multiply与字典映射一起使用。这将更有效,因为它利用了 Pandas 数据帧后面的 NumPy 数组的连续内存块特性。pd.DataFrame.apply只是一个薄薄的循环,可以更合适地应用于 alist而不是数据帧。

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

推荐阅读