如何根据名称对 pandas 中的多列进行分组?

How to groupby multiple columns in pandas based on name?

我想创建一个新的数据框,其中的列计算为来自此数据框的具有相似名称的列的平均值:

            B6_i     B6_ii    B6_iii  ...  BXD80_i   BXD80_ii   BXD81_i
data                                  ...                              
Cd38    0.598864 -0.225322  0.306926  ... -0.312190  0.281429  0.424752
Trim21  1.947399  2.920681  2.805861  ...  1.469634  2.103585  0.827487
Kpnb1  -0.458240 -0.417507 -0.441522  ... -0.314313 -0.153509 -0.095863
Six1    1.055255  0.868148  1.012298  ...  0.142565  0.264753  0.807692

新数据框应如下所示:

               B6     BXD80  ...    BXD81
data                                 
Cd38    -0.041416 -0.087859  ...  0.424752
Trim21  15.958981  3.091500  ...  0.827487
Kpnb1   -0.084471  0.048250  ... -0.095863
Six1     0.927383  0.037745  ...  0.807692

(like (B6_i + B6_ii + B6_iii)/3),基于所有字符直到下划线“_”)

一些列是 n 列中的一个,而其他列是单数列(如 'BXD81_i'),因此我需要一种方法,可以对每个均值计算使用不同的数字。

您可以按 _:

之前的值聚合每列 mean
df.columns = df.columns.str.split('_', expand=True)

df1 = df.groupby(level=0, axis=1).mean()

或者:

df1 = df.groupby(lambda x: x.split('_')[0], axis=1).mean()
print (df1)
              B6     BXD80     BXD81
data                                
Cd38    0.226823 -0.015381  0.424752
Trim21  2.557980  1.786609  0.827487
Kpnb1  -0.439090 -0.233911 -0.095863
Six1    0.978567  0.203659  0.807692