在python

时间:2015-10-26 22:41:09

标签: python pandas dataframe multiple-columns

我正在尝试编写一个函数,该函数将对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功能,可以让我更快地总结这些功能?

3 个答案:

答案 0 :(得分:4)

我认为你正在寻找filter的{​​{1}}方法;你可以传递一个字符串或正则表达式,它只返回名称与之匹配的列。然后,您只需在结果列中调用DataFrame或其他任何内容:

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)将返回列的总和。

答案 1 :(得分:4)

你可以这样做:

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

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

答案 2 :(得分:3)

即使您正在写出所有列名,还有几种方法可以更优雅地完成总和:

public static int findLastOccurance(int[] items, int key){
    return linearSearchRecursive(items, key, items.length - 1);
}

然后,您始终可以使用标准Python工具来操作字符串,将列名列表放在一起:

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')