对一些具有特殊字符的数据帧求和



我有一个数据帧如下:

G-openF-open0
A-open A-close A-totalG-closeG-total
1 4 0 3 0 8 2

您可以提取破折号之前的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

最新更新