【问题标题】:mean over all columns with the same prefix in python pandas意味着在python pandas中具有相同前缀的所有列
【发布时间】:2021-08-18 19:17:10
【问题描述】:

我有一个带有多个变量的 pandas df,我想计算它的平均值。列以变量名作为前缀,变量级别作为后缀来命名。实际上,我得到了很多变量,每个变量有 30 个级别,但是有 2 个级别和 2 个变量,它看起来像这样:

[index, oneVariable_s1, oneVariable_s2, otherVariable_s1, otherVariable_s2]

数据可以这样生成:

data = [{'index':'p001', 'oneVariable_s1': 1, 'oneVariable_s2': 2, 'otherVariable_s1':3, 'otherVariable_s2':6},
        {'index':'p002','oneVariable_s1':10, 'oneVariable_s2': 20, 'otherVariable_s1': 30, 'otherVariable_s2':6}]

df = pd.DataFrame(data).set_index('index')
df

有没有办法自动计算“_s1”到“_s30”之前具有相同变量名/相同前缀的所有列的平均值,这样我就不必写下所有变量名来计算平均值?到目前为止,我已经使用它来计算列的平均值:

df['oneVariable_mean'] = df.filter(like='oneVariable').mean(axis=1)
df['otherVariable_mean'] = df.filter(like='otherVariable').mean(axis=1)

这导致了我正在寻找的解决方案,但我需要输入所有变量名。

【问题讨论】:

  • 您的问题完全不清楚如何帮助您。您需要提供更多详细信息,可能是人们可以运行的工作示例。
  • 你的意思是什么类型的工作示例?我发布了数据结构和代码,它可以完成这项工作,但不是以自动化方式?
  • "数据的结构"`???不,你没有,你只是发布了一些列名。我无法复制你的代码并在 py 自己的电脑上运行它,这就是我所说的工作示例。
  • 所以数据框中的列始终采用这种格式:<var_name>_s<var_level> ?
  • 我最初想在我的帖子中添加一个表格,但我不知道该怎么做。我添加了一个代码来生成一个基本的工作示例。

标签: python pandas dataframe mean


【解决方案1】:

当您确认列名格式为<var_name>_s<var_level> 后,您可以先使用pandas str.split 方法拆分"_s" 上的列名并获取变量名。使用set 仅选择唯一的变量名称。

然后只需计算所有唯一变量的平均值,因为您已经使用 filter 单独计算它们:

unique_vars = set([var[0] for var in df.columns.str.split('_s')])
for var in unique_vars:
    df[var + '_mean'] = df.filter(like=var).mean(axis=1)

输出:

>>> df
       oneVariable_s1  oneVariable_s2  otherVariable_s1  otherVariable_s2  otherVariable_mean  oneVariable_mean
index                                                                                                          
p001                1               2                 3                 6                 4.5               1.5
p002               10              20                30                 6                18.0              15.0

【讨论】:

    【解决方案2】:

    始终保持数据长而不宽,以实现高效存储、更轻松的无循环计算以及增强的可维护性和可再现性。大多数分析步骤(聚合、合并、绘图、测试、建模)都需要长格式数据。宽幅格式通常用于演示或报告目的。

    具体来说,运行pandas.wide_to_long。然后,根据需要运行均值聚合:

    long_df = pd.wide_to_long(
        df.assign(id = df.index),
        stubnames = ["oneVariable", "anotherVariable"],
        i = "id",
        j = "s_num",
        sep = "_",
        suffix = r"\w+"
    )
    
    means = long_df.agg("mean")
    means
    
    grp_means = long_df.groupby(["group"]).agg("mean")
    grp_means
    

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 2019-11-12
      • 2018-09-01
      • 1970-01-01
      • 2021-06-13
      • 2022-01-23
      • 1970-01-01
      • 2019-09-14
      • 2022-12-13
      相关资源
      最近更新 更多