【问题标题】:Merge values split into different columns合并拆分为不同列的值
【发布时间】:2015-10-29 15:20:21
【问题描述】:

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

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

这是我的第一次尝试:

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. 有没有办法通过对某些列的值求和来合并某些列,而不必在之后删除剩余的列?

【问题讨论】:

  • 为什么要ch1a、ch1b和ch1c变成ch1a?变成ch1不是更自然吗?
  • 好的,ch1,没关系:)
  • 这就是我在回答中所做的;)

标签: python join pandas merge dataframe


【解决方案1】:

这会得到你想要的结果:

cols_to_sum = ['ch1a', 'ch1b', 'ch1c']
df['ch1'] = df.loc[:, cols_to_sum].sum(axis=1)
df.drop(cols_to_sum, axis=1)

您的问题是对所有列求和。在这里,我们将其限制为相关的。

我不知道如何避免drop

【讨论】:

    【解决方案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
    

    【讨论】:

    • 太棒了!如果列名的名称完全不同并且您想要合并它们怎么办。喜欢 Ch1 和 Ax2 吗?谢谢
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2019-03-16
    • 2013-07-24
    相关资源
    最近更新 更多