给定数据框:
val1_aa val1_bb val2_aa val2_bb val2_cc val3_cc
id
100 6 0 3 4 3 1
200 0 1 0 0 1 0
300 5 1 1 0 4 0
400 0 3 1 5 7 1
我希望按照每个列标题中的后缀顺序对所有列进行求和。我想要的输出:
aa bb cc
id
100 9 4 4
200 0 1 1
300 6 1 4
400 1 8 8
我如何得到这个?
下面发布的答案。
答案 0 :(得分:3)
您可以使用extract
:
df = df.groupby(df.columns.str.extract('_(.*)', expand=False), axis=1).sum()
print (df)
aa bb cc
id
100 9 4 4
200 0 1 1
300 6 1 4
400 1 8 8
MultiIndex
的另一种解决方案:
df.columns = df.columns.str.split('_', expand=True)
print (df)
val1 val2 val3
aa bb aa bb cc cc
id
100 6 0 3 4 3 1
200 0 1 0 0 1 0
300 5 1 1 0 4 0
400 0 3 1 5 7 1
df = df.groupby(level=1, axis=1).sum()
print (df)
aa bb cc
id
100 9 4 4
200 0 1 1
300 6 1 4
400 1 8 8
答案 1 :(得分:3)
您可以在groupby
lambda
功能axis=1
In [4178]: df.groupby(lambda x: x.split('_')[-1], axis=1).sum() # or x.split('_')[1]
Out[4178]:
aa bb cc
id
100 9 4 4
200 0 1 1
300 6 1 4
400 1 8 8
答案 2 :(得分:1)
可以在列上使用groupby
。
x.groupby(x.columns.str.split('_').str[1], axis=1).sum()
x
val1_aa val1_bb val2_aa val2_bb val2_cc val3_cc
id
100 6 0 3 4 3 1
200 0 1 0 0 1 0
300 5 1 1 0 4 0
400 0 3 1 5 7 1
x.columns.str.split('_').str[1]
Index(['aa', 'bb', 'aa', 'bb', 'cc', 'cc'], dtype='object')
y = x.groupby(x.columns.str.split('_').str[1], axis=1).sum()
y
aa bb cc
id
100 9 4 4
200 0 1 1
300 6 1 4
400 1 8 8