优雅地总结 python 中命名的 DataFrame 列

Elegantly summing named DataFrame columns in python

我正在尝试编写一个函数来对 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 函数可以让我更快地求和这些函数?

我认为您正在寻找 DataFramefilter 方法;您可以将字符串或正则表达式传递给它,它只会 return 名称匹配的列。然后你可以调用 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) 到 return 行总和,默认情况下,sum 将 return 列总和.

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

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

你可以这样做:

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

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