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