pandas中的Groupby列后缀

时间:2017-09-27 11:21:38

标签: python pandas dataframe group-by pandas-groupby

给定数据框:

     val1_aa  val1_bb  val2_aa  val2_bb  val2_cc  val3_cc
id                                                       
100        6        0        3        4        3        1
200        0        1        0        0        1        0
300        5        1        1        0        4        0
400        0        3        1        5        7        1

我希望按照每个列标题中的后缀顺序对所有列进行求和。我想要的输出:

     aa  bb  cc
id             
100   9   4   4
200   0   1   1
300   6   1   4
400   1   8   8

我如何得到这个?

下面发布的答案。

3 个答案:

答案 0 :(得分:3)

您可以使用extract

df = df.groupby(df.columns.str.extract('_(.*)', expand=False), axis=1).sum()
print (df)
     aa  bb  cc
id             
100   9   4   4
200   0   1   1
300   6   1   4
400   1   8   8

MultiIndex的另一种解决方案:

df.columns = df.columns.str.split('_', expand=True)
print (df)
    val1    val2       val3
      aa bb   aa bb cc   cc
id                         
100    6  0    3  4  3    1
200    0  1    0  0  1    0
300    5  1    1  0  4    0
400    0  3    1  5  7    1

df = df.groupby(level=1, axis=1).sum()
print (df)
     aa  bb  cc
id             
100   9   4   4
200   0   1   1
300   6   1   4
400   1   8   8

答案 1 :(得分:3)

您可以在groupby

上使用lambda功能axis=1
In [4178]: df.groupby(lambda x: x.split('_')[-1], axis=1).sum()  # or x.split('_')[1]
Out[4178]:
     aa  bb  cc
id
100   9   4   4
200   0   1   1
300   6   1   4
400   1   8   8

答案 2 :(得分:1)

可以在列上使用groupby

x.groupby(x.columns.str.split('_').str[1], axis=1).sum()
x
     val1_aa  val1_bb  val2_aa  val2_bb  val2_cc  val3_cc
id                                                       
100        6        0        3        4        3        1
200        0        1        0        0        1        0
300        5        1        1        0        4        0
400        0        3        1        5        7        1

x.columns.str.split('_').str[1]
Index(['aa', 'bb', 'aa', 'bb', 'cc', 'cc'], dtype='object')

y = x.groupby(x.columns.str.split('_').str[1], axis=1).sum()

y
     aa  bb  cc
id             
100   9   4   4
200   0   1   1
300   6   1   4
400   1   8   8