熊猫数据框根据名称对列进行分组并应用函数

Posted

技术标签:

【中文标题】熊猫数据框根据名称对列进行分组并应用函数【英文标题】:pandas dataframe group columns based on name and apply a function 【发布时间】:2021-05-14 04:36:14 【问题描述】:

我有一个数据框:

df = [A   B   C   D  E_p0   E_p1   E_p2    K_p0  K_p1  K_2  
      a   2   r   4   3       6     1       9     5     1
      e   g   1   d   5       8     2       7     1     4]

我想根据前缀对列进行分组,并通过函数聚合它们,例如平均值、最大值或 rms。 因此,例如,如果我的函数是最大值,则输出为:

df = [A   B   C   D   E    K  
      a   2   r   4   6    9  
      e   g   1   d   8    7   ]

【问题讨论】:

这能回答你的问题吗? GroupBy columns on column header prefix @dm2 看起来不错,只是它限制我使用预定义的聚合函数(例如 sum()),我如何分组然后应用自定义聚合函数? 【参考方案1】:

您可以将不带分隔符的列转换为索引,然后使用 lambda 函数对每列使用聚合函数(如 max)进行分组:

m = df.columns.str.contains('_')

df = (df.set_index(df.columns[~m].tolist())
        .groupby(lambda x: x.split('_')[0], axis=1)
        .max()
        .reset_index())
print (df)
   A  B  C  D  E  K
0  a  2  r  4  6  9
1  e  g  1  d  8  7

自定义函数的解决方案:

def rms(x):
    return np.sqrt(np.sum(x**2, axis=1)/len(x.columns))

m = df.columns.str.contains('_')

df1 = (df.set_index(df.columns[~m].tolist())
        .groupby(lambda x: x.split('_')[0], axis=1)
        .agg(rms)
        .reset_index())
print (df1)
   A  B  C  D         E         K
0  a  2  r  4  3.915780  5.972158
1  e  g  1  d  5.567764  4.690416

【讨论】:

谢谢,如果我想要一个自定义函数而不是最大值(例如 RMS)? @okuoub - 添加到答案中。

以上是关于熊猫数据框根据名称对列进行分组并应用函数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法根据熊猫中的唯一值对列进行排序?

根据熊猫数据框中的列标签对数据进行分组

如何在熊猫中按值计数对列进行排序

将熊猫数据框按两列分组而不汇总

使用其他行中的值将函数应用于熊猫数据框行

如何在熊猫数据框中创建滑动窗口并应用函数