Pandas :对多列求和,得到多列的结果

Pandas : Sum multiple columns and get results in multiple columns

我有一个这样的"sample.txt"

idx A   B   C   D   cat
J   1   2   3   1   x
K   4   5   6   2   x
L   7   8   9   3   y
M   1   2   3   4   y
N   4   5   6   5   z
O   7   8   9   6   z

有了这个数据集,我想得到行和列的总和。 在行中,这没什么大不了的。 我做了这样的结果。

### MY CODE ###
import pandas as pd

df = pd.read_csv('sample.txt',sep="\t",index_col='idx')
df.info()

df2 = df.groupby('cat').sum()
print( df2 )

结果是这样的

      A   B   C   D
cat                
x     5   7   9   3
y     8  10  12   7
z    11  13  15  11

但我不知道如何编写代码来获得这样的结果。 (只需在 A 和 B 列以及 C 和 D 列中添加值)

    AB  CD
J   3   4
K   9   8
L   15  12
M   3   7
N   9   11
O   15  15

谁能帮忙写个代码?

顺便说一句,我不想​​这样做。 (看起来太无聊了,但如果这是唯一的方法,我会相信)

df2 = df['A'] + df['B']
df3 = df['C'] + df['D']
df = pd.DataFrame([df2,df3],index=['AB','CD']).transpose()
print( df )

concatsum 一起使用:

df = df.set_index('idx')
df = pd.concat([df[['A', 'B']].sum(1), df[['C', 'D']].sum(1)], axis=1, keys=['AB','CD'])
print( df)
     AB  CD
idx        
J     3   4
K     9   8
L    15  12
M     3   7
N     9  11
O    15  15

这是否满足您的需求?通过将 axis=1 与 DataFrame.apply 一起使用,您可以在一行中使用您想要的数据来构造一个新列。然后您可以删除不再需要的列。

In [1]: import pandas as pd
In [5]: df = pd.DataFrame(columns=['A', 'B', 'C', 'D'], data=[[1, 2, 3, 4], [1, 2, 3, 4]])

In [6]: df
Out[6]:
   A  B  C  D
0  1  2  3  4
1  1  2  3  4

In [7]: df['CD'] = df.apply(lambda x: x['C'] + x['D'], axis=1)

In [8]: df
Out[8]:
   A  B  C  D  CD
0  1  2  3  4   7
1  1  2  3  4   7

In [13]: df.drop(['C', 'D'], axis=1)
Out[13]:
   A  B  CD
0  1  2   7
1  1  2   7

当您将字典或可调用对象传递给 groupby 时,它会应用于轴。我指定了轴一,它是列。

d = dict(A='AB', B='AB', C='CD', D='CD')
df.groupby(d, axis=1).sum()