【问题标题】:Applying function / calculation to multiple columns in pandas将函数/计算应用于熊猫中的多个列
【发布时间】:2018-07-07 01:44:36
【问题描述】:

我需要对 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  

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

【问题讨论】:

  • 我注意到您正在使用函数定义来返回数据帧的“列”,但您没有传入数据帧。您是否将此功能应用于数据框?您没有显示此代码的更多内容吗?另外,您能否将示例数据框作为文本(不是图片)作为Minimal, Complete, and Verifiable example 的一部分包含在内?

标签: python pandas numpy dataframe


【解决方案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】:

    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
    

    【讨论】:

      【解决方案3】:

      尝试以下方法:

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

      干杯

      【讨论】:

      • 你能完整地演示你的代码是如何工作的吗?我一直遇到错误。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多