我有一个数据框,其中一些值分为不同的列:
ch1a ch1b ch1c ch2
0 0 4 10
0 0 5 9
0 6 0 8
0 7 0 7
8 0 0 6
9 0 0 5
我想对这些列求和并保持正常的列(如ch2
)。
期望的结果应该是:
ch1a ch2
4 10
5 9
6 8
7 7
8 6
9 5
我看了两个pandas函数,merge
和join
,但我找不到合适的pandas函数。
这是我的第一次尝试:
df = pd.DataFrame({'ch1a': [0, 0, 0, 0, 8, 9],'ch1b': [0, 0, 6, 7, 0, 0],'ch1c': [4, 5, 0, 0, 0, 0],'ch2': [10, 9, 8, 7, 6, 5]})
df['ch1a'] = df.sum(axis=1)
del df['ch1b']
del df['ch1c']
但结果不是我想要的:
ch1a ch2
0 14 10
1 14 9
2 14 8
3 14 7
4 14 6
5 14 5
我有两个问题:
答案 0 :(得分:2)
这会得到你想要的结果:
cols_to_sum = ['ch1a', 'ch1b', 'ch1c']
df['ch1'] = df.loc[:, cols_to_sum].sum(axis=1)
df.drop(cols_to_sum, axis=1)
你的问题是你在对所有专栏进行总结。在这里,我们将其限制为相关的。
我不知道如何避免使用drop
。
答案 1 :(得分:2)
您可以使用axis = 1:
执行水平(逐列)组>>> df.groupby(df.columns.str[:3], axis=1).sum()
ch1 ch2
0 4 10
1 5 9
2 6 8
3 7 7
4 8 6
5 9 5
在这里,我使用列的前三个字母来确定目标组,但您可以使用函数或字典或列表:
>>> df.groupby(lambda x: x[:3], axis=1).sum()
ch1 ch2
0 4 10
1 5 9
2 6 8
3 7 7
4 8 6
5 9 5
>>> df.groupby(['a','b','b','c'], axis=1).sum()
a b c
0 0 4 10
1 0 5 9
2 0 6 8
3 0 7 7
4 8 0 6
5 9 0 5