【问题标题】:For each row, how to sum values for columns start with same string对于每一行,如何对以相同字符串开头的列的值求和
【发布时间】:2019-08-14 21:42:37
【问题描述】:

编辑:列名确实以超过 1 个字符开头,但使用 sep='_',它更像 AAA_BBB、AAA_DDD、BBB_EEE、BBB_FFF、...

感谢 groupby 解决方案!


我有一个这样的熊猫数据框(借用另一个问题):

df =

C1    C2    T3  T5
28    34    11  22
45    100   33  66

如何获得一个新的数据框,其中包含具有相同“起始字符串”的列的总和,例如“C”、“T”?谢谢!

df =

C     T  
62    33    
145   99

不幸的是,我必须处理这种数据帧结构,并且数据帧中大约有 1000 列,看起来像 A1,A2,A3,B1,B2,B3,...

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用,

     df.groupby(df.columns.str[0], axis=1).sum()
    

    输出:

         C   T
    0   62  33
    1  145  99
    

    【讨论】:

      【解决方案2】:

      pandas.DataFrame.groupbyaxis=1

      OP 对列名的一般特征含糊不清。请阅读各种选项以确定更适合您的具体情况的选项。

      callable 版本#1

      假设您的列前缀是单个字符...

      from operator import itemgetter
      
      df.groupby(itemgetter(0), axis=1).sum()
      
           C   T
      0   62  33
      1  145  99
      

      当您将callable 传递给pandas.DataFrame.groupby 时,它会将可调用对象映射到索引(如果axis=1 则映射到列)并让唯一结果充当分组键。


      callable 版本 #2:我们自己滚动

      稍微复杂一些,但对于单个字符前缀来说应该是健壮的。此外,不使用导入。

      def yield_while_alpha(x):
          it = iter(x)
          y = next(it)
          while y.isalpha():
              yield y
              y = next(it)
      
      def get_prefix(x):
          return ''.join(yield_while_alpha(x))
      
      df.groupby(get_prefix, axis=1).sum()
      
           C   T
      0   62  33
      1  145  99
      

      同样的想法,但改用itertools

      from itertools import takewhile
      
      df.groupby(
          lambda x: ''.join(takewhile(str.isalpha, x)),
          axis=1
      ).sum()
      
           C   T
      0   62  33
      1  145  99
      

      pandas.Index.str.extract

      或者我们不必使用callable

      df.groupby(df.columns.str.extract('(\D+)', expand=False), axis=1).sum()
      
           C   T
      0   62  33
      1  145  99
      

      【讨论】:

        【解决方案3】:

        使用MultiIndex 的替代方法:

        df.columns = [df.columns.str[0], df.columns]
        df.groupby(level=0, axis=1).sum()
        

        【讨论】:

          猜你喜欢
          • 2023-01-29
          • 2022-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多