优雅地总结 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 函数可以让我更快地求和这些函数?
我认为您正在寻找 DataFrame
的 filter
方法;您可以将字符串或正则表达式传递给它,它只会 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 求和。
我正在尝试编写一个函数来对 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 函数可以让我更快地求和这些函数?
我认为您正在寻找 DataFrame
的 filter
方法;您可以将字符串或正则表达式传递给它,它只会 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 求和。