首页 > 解决方案 > 如何对列名的一部分进行分组,并聚合意味着?

问题描述

我可以取两列的平均值,并将其作为新列返回,但我不知道如何对原始数据具有的特定约定中的所有列执行此操作。目标是平均 A1 和 D1,...,A12 和 D12 等。

我尝试了以下内容的不同迭代,但如果我不指定确切的列,它就不起作用......

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

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

标签: pythonpandasmeancalculated-columns

解决方案


  • 如评论中所述,column.startswith('A') and column.startswith('D')永远不会是真的。
  • 评论中的解决方案很接近,但切片的位置不正确,它是所有列的平均值,而不仅仅是Aand D
  • [1:]在第一个字符之后开始切片(例如A1[1:]is 1
  • 真正的 Python:字符串索引
  • 创建一个布尔掩码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

推荐阅读