我有一个" 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 )
答案 0 :(得分:6)
当您将字典或可调用字符传递给groupby
时,它会应用于轴。我指定了一个是列的轴。
d = dict(A='AB', B='AB', C='CD', D='CD')
df.groupby(d, axis=1).sum()
答案 1 :(得分:3)
将concat
与sum
:
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
答案 2 :(得分:1)
这可以满足您的需求吗?通过在DataFrame.apply中使用axis = 1,您可以使用所需的数据来构造新列。然后,您可以删除不再需要的列。
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