我有一个数据帧,其中一些值被拆分到不同的列中:
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
我看了两个panda函数,merge
和join
,但我找不到适合我的情况的函数。
这是我的第一次尝试:
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
我有两个问题:
- 我怎样才能得到我想要的结果
- 有没有一种方法可以通过对某些列的值求和来合并它们,而不必在之后删除其余的列
这将获得所需的结果:
cols_to_sum = ['ch1a', 'ch1b', 'ch1c']
df['ch1'] = df.loc[:, cols_to_sum].sum(axis=1)
df.drop(cols_to_sum, axis=1)
你的问题是你对所有列求和。在这里,我们将其限制为相关的。
不过我不知道如何避开drop
。
您可以使用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