【问题标题】:Pandas dataframe conditional mean based on column names基于列名的 Pandas 数据框条件均值
【发布时间】:2018-03-27 08:53:51
【问题描述】:

从数据框示例开始最容易解释:

    TimeStamp   382.098     382.461     383.185     383.548
    10:28:00    0.012448    0.012362    0.0124485   0.012362
    10:30:00    0.0124135   0.0123965   0.0124135   0.012431
    10:32:00    0.0551035   0.0551725   0.055931    0.0563105
    10:34:00    0.055586    0.0557245   0.056655    0.0569485
    10:36:00    0.055586    0.055776    0.0568105   0.057362

我希望我的输出是:

    TimeStamp   382         383
    10:28:00    0.012405    0.01240525
    10:30:00    0.012405    0.01242225
    10:32:00    0.05513     0.05612075
    10:34:00    0.05565525  0.05680175
    10:36:00    0.055681    0.05708625

所以,我想查看列名值,如果它们与整数相同,我希望输出 col 具有每个时间索引值的平均值。

我的想法是使用 df.round 将列标题四舍五入到最接近的整数,然后使用 .mean() 以某种方式在 axis = 0 上为相同的 col 标题应用平均值。但是,我在数据帧索引类型上使用 round 函数时出错。

编辑:根据答案,我使用了

df.rename(columns=dict(zip(df.columns[0:], df.columns[0:]\
          .values.astype(float).round().astype(str))),inplace=True)
df = df.groupby(df.columns[0:], axis=1).mean()

它弄乱了列名和值,而不是根据列名给我平均值......不知道为什么!

【问题讨论】:

  • 是吗?如果您需要从答案中得到澄清,请提出要求。谢谢。

标签: python pandas dataframe mean


【解决方案1】:

沿第一个轴使用groupby 和lambda。

df.set_index('TimeStamp', inplace=True)
df.groupby(by=lambda x: int(x.split('.')[0]), axis=1).mean()

                382       383
TimeStamp
10:28:00   0.012405  0.012405
10:30:00   0.012405  0.012422
10:32:00   0.055138  0.056121
10:34:00   0.055655  0.056802
10:36:00   0.055681  0.057086

【讨论】:

  • 这只是拆分它而不是圆它!
  • 此处的输出与问题的所需输出相匹配。如果不是,您在寻找什么?
  • @Brain_overflowed 它与您发布的预期输出完全相同。如果有问题,您必须解释原因。我建议先尝试答案,然后再写下它们……
【解决方案2】:

使用类型转换重命名列,将TimeStamp移动到索引,然后使用groupby获取列含义:

df.rename(columns=lambda x: int(float(x)) if x!="TimeStamp" else x, inplace=True)
df.set_index("TimeStamp", inplace=True)

df
                382       382       383       383
TimeStamp                                        
10:28:00   0.012448  0.012362  0.012448  0.012362
10:30:00   0.012414  0.012396  0.012414  0.012431
10:32:00   0.055103  0.055172  0.055931  0.056310
10:34:00   0.055586  0.055725  0.056655  0.056948
10:36:00   0.055586  0.055776  0.056810  0.057362


df.groupby(df.columns, axis=1).mean()

                382       383
TimeStamp                    
10:28:00   0.012405  0.012405
10:30:00   0.012405  0.012422
10:32:00   0.055138  0.056121
10:34:00   0.055655  0.056802
10:36:00   0.055681  0.057086

【讨论】:

    【解决方案3】:

    与np.floor rename 和groupby

    df.rename(columns=dict(zip(df.columns[1:], np.floor(df.columns[1:].values.astype(float)).astype(str))),inplace=True)
    df.set_index('TimeStamp').groupby(level=0,axis=1).mean().reset_index()
    Out[171]: 
      TimeStamp     382.0     383.0
    0  10:28:00  0.012405  0.012405
    1  10:30:00  0.012405  0.012422
    2  10:32:00  0.055138  0.056121
    3  10:34:00  0.055655  0.056802
    4  10:36:00  0.055681  0.057086
    

    【讨论】:

    • 唉,这个用户也是一样。先接受我的回答,然后不接受。
    • @cᴏʟᴅsᴘᴇᴇᴅ 我还是更喜欢你的解决方案 ~ :-)
    • OP 是善变的野兽。他们不知道自己想要什么。
    • @Brain_overflowed 这是问题后一年.. 哈哈
    • 这个问题太老了,无法获得 IMO 的赏金。并且描述的解决方案有效。
    【解决方案4】:

    另一种方法是通过pd.to_numeric,只是@coldspeed 答案的一个轻微变体,即

    df = df.set_index('TimeStamp')
    
    df.groupby(pd.to_numeric(df.columns).astype(int),1).mean()
    
                382       383
    TimeStamp                    
    10:28:00   0.012405  0.012405
    10:30:00   0.012405  0.012422
    10:32:00   0.055138  0.056121
    10:34:00   0.055655  0.056802
    10:36:00   0.055681  0.057086
    

    【讨论】:

    • 我很抱歉耽搁了
    【解决方案5】:

    广义解

    df = pd.DataFrame({383.045:[1,2], 383.96:[3,4], 383.78:[5,5], 343:[9,11]})
    df.columns = [int(i) for i in df.columns]
    for i in set(df.columns):
        if len(df[i].shape) == 2:
            mean = df[i].T.sum()/float(df[i].shape[1])
            df = df.drop([i],1)
            df[i] = mean
    

    【讨论】:

    • 为什么这样更好?
    • 我非常怀疑它是。请不要乱搞,您无法决定您的解决方案是否更好。把它留给OP和选民。也不要乞求投票,这在这里很糟糕。
    • 谢谢@coldspeed,我会记住这件事:)
    【解决方案6】:

    要将列值四舍五入为最接近的整数,您可以在列表理解上进行分组,该列表理解将每一列(除了第一列是TimeStamp)四舍五入为最接近的整数,然后取整数:

    >>> (df
         .set_index('TimeStamp')
         .groupby([int(round(col, 0)) for col in df.columns[1:].astype(float)], axis=1)
         .mean())
                    382       383       384
    TimeStamp                              
    10:28:00   0.012405  0.012448  0.012362
    10:30:00   0.012405  0.012414  0.012431
    10:32:00   0.055138  0.055931  0.056310
    10:34:00   0.055655  0.056655  0.056948
    10:36:00   0.055681  0.056810  0.057362
    

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 2018-06-10
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多