我有一个数据帧如下:
A-open | A-close | A-total | G-openG-close | G-total | F-open||||
---|---|---|---|---|---|---|---|---|
1 | 4 | 0 | 3 | 0 | 8 | 2 | 0
您可以提取破折号之前的id,并将其用于列上的groupby
+sum
:
groups = df.columns.str.split('-').str[0]
d = df.groupby(groups, axis=1).sum().add_suffix('-total')
输出:
A-total F-total G-total
0 5 10 8
插入/替换为列:
df[d.columns] = d
输出:
A-open A-close A-total G-open G-close G-total F-open F-close F-total
0 1 4 5 3 5 8 8 2 10
注意。这是假设"X-total"列最初不存在或为空。如果不是空的:
df[d.columns] = d-df[d.columns]
我们可以在列swaplevel
上使用str.rsplit
将其转换为MultiIndex,从而使顶级列为";打开"关闭";,以及";总计";。MultiIndex的好处是,我们可以使用索引对齐来进行计算,并且计算可以按惯例进行:
# Create MultiIndex
df.columns = df.columns.str.rsplit('-', n=1, expand=True).swaplevel()
# Multi Index allows for idiomatic computations like this:
df['total'] = df['open'] + df['close']
# Collapse MultiIndex
df.columns = [f'{b}-{a}' for (a, b) in df.columns]
df
:
A-open A-close A-total G-open G-close G-total F-open F-close F-total
0 1 4 5 3 5 8 8 2 10
设置:
import pandas as pd
df = pd.DataFrame({
'A-open': [1], 'A-close': [4], 'A-total': [0], 'G-open': [3],
'G-close': [5], 'G-total': [0], 'F-open': [8], 'F-close': [2],
'F-total': [0]
})
通过将所有列名按'-'拆分并保留第一个字母,将输出放入一个集合中以删除重复项,获得不同字母列集的列表:
letters = list({i.split('-')[0] for i in df.columns.to_list()})
print(letters)
{'A', 'F', 'G'}
然后,您可以循环这些,并通过添加打开和关闭来计算每个列的总列数:
for l in letters:
df[l + '-total'] = df[l + '-open'] + df[l + '-close']
最终df:
A-open A-close A-total G-open G-close G-total F-open F-close F-total
0 1 4 5 3 5 8 8 2 10