如何对列名称的一部分进行分组,并进行汇总?

问题描述

我可以取两列的平均值,然后将其作为新列返回,但是我无法弄清楚如何针对原始数据具有的特定约定对所有列执行此操作。目标是平均A1和D1,...,A12和D12等。

我尝试了下面的内容的不同迭代,但是如果我没有指定确切的列,它将无法正常工作...

import pandas as pd
df = pd.DataFrame({'Time': [0.1,0.2,0.3],'A1': [1000,2000,3000],'A12': [1000,'B1': [4000,5000,6000],'B12': [4000,'D1': [40000,50000,42000],'D12': [40000,42000]})

for column in d.columns:
    if column.startswith('A') and column.startswith('D'):
        d= (d[['A1','D1']].iloc[:].mean(axis=1))

解决方法

  • 如评论中所述,column.startswith('A') and column.startswith('D')将永远是不正确的。
  • 评论中的解决方案很接近,但是切片的位置不正确,这是所有列的平均值,而不仅仅是AD
  • [1:]在第一个字符之后开始切片(例如A1[1:]1
  • Real Python: String Indexing
  • 在这种情况下,用Boolean mask创建一个pandas.Series.str.contains仅查找感兴趣的列AD
      使用
    • .contains是因为它可以识别正则表达式模式,而.startswith则不能。
  • 仅在所需列上执行.groupby
    • df[cols].groupby(df[cols].columns.str[1:],axis=1)
# select columns with A or D
cols = df.columns[df.columns.str.contains('A|D')]

dfm = df.join(df[cols].groupby(df[cols].columns.str[1:],axis=1).mean().astype(float).add_prefix('AD_mean_'))

   Time    A1   A12    B1   B12     D1    D12  AD_mean_1  AD_mean_12
0   0.1  1000  1000  4000  4000  40000  40000    20500.0     20500.0
1   0.2  2000  2000  5000  5000  50000  50000    26000.0     26000.0
2   0.3  3000  3000  6000  6000  42000  42000    22500.0     22500.0