合并值拆分为不同的列

时间:2015-10-29 15:20:21

标签: python join pandas merge dataframe

我有一个数据框,其中一些值分为不同的列:

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函数,mergejoin,但我找不到合适的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

我有两个问题:

  1. 如何获得理想的结果?
  2. 有没有办法通过汇总它们的值来合并某些列,而不必在之后删除剩余的列?

2 个答案:

答案 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