【问题标题】:Elegantly summing named DataFrame columns in python在 python 中优雅地汇总命名 DataFrame 列
【发布时间】:2015-10-26 22:41:09
【问题描述】:

我正在尝试编写一个函数,它将对 pandas DataFrame 中的一组指定列进行求和。

首先,一些背景。每个数据都有一个带有名称的列(例如,“var”)和该名称旁边按顺序排列的数字(例如,“var1, var2”)。我知道我可以将 5 列与以下代码相加:

import pandas as pd
data = pd.read_csv('data_file.csv')
data['var_total'] = data.var1 + data.var2 + data.var3 + data.var4 + data.var5

但是,当您要对 var1-var30 求和时,这可能会重复。我认为必须有一些优雅的解决方案来更快地对它们求和,因为列名是可预测且统一的。有没有我可以编写的函数或内置的 pandas 函数可以让我更快地求和?

【问题讨论】:

    标签: python pandas dataframe multiple-columns


    【解决方案1】:

    你可以这样做:

    data['var_total'] = data.filter(regex='var[0-9]+').sum(axis=1)
    

    这将首先过滤您的数据框以仅保留以 var 开头并后跟一个或多个数字的列。然后它将在生成的过滤后的 DataFrame 中求和。

    【讨论】:

      【解决方案2】:

      我认为您正在寻找DataFramefilter 方法;您可以将字符串或正则表达式传递给它,它只会返回名称与之匹配的列。然后你可以在结果列上调用sum 或任何你想要的:

      pd.DataFrame({'var1':[1], 'var2':[2],'othercol':['abc']})
        othercol  var1  var2
      0      abc     1     2
      
      pd.DataFrame({'var1':[1], 'var2':[2],'othercol':['abc']}).filter(like='var')
         var1  var2
      0     1     2
      
      pd.DataFrame({'var1':[1], 'var2':[2],'othercol':['abc']}).filter(like='var').sum(axis=1)
      
      0    3
      

      顺便提一下,我调用了sum(axis=1) 来返回逐行的总和,默认情况下,sum 将返回列的总和。

      【讨论】:

        【解决方案3】:

        即使您要写出所有列名,也有几种方法可以更优雅地求和:

        import pandas as pd
        import numpy as np
        
        df = pd.DataFrame({'var1': np.random.randint(1, 10, 10),
                           'var2': np.random.randint(1, 10, 10),
                           'var3': np.random.randint(1, 10, 10)})
        
        # Use the sum method:
        df[['var1', 'var2', 'var3']].sum(axis='columns')
        
        # Use eval
        df.eval('var1 + var2 + var3')
        

        然后你总是可以使用标准的 Python 工具来操作字符串来组合列名列表:

        cols = ['var' + str(n) for n in range(1, 3 + 1)]
        cols
        Out[9]: ['var1', 'var2', 'var3']
        
        df[cols].sum(axis='columns')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-25
          • 1970-01-01
          • 1970-01-01
          • 2019-07-21
          • 2019-01-28
          • 1970-01-01
          • 2017-12-31
          • 2010-11-16
          相关资源
          最近更新 更多