基于列名称的 Pandas dataframe 条件均值

14

从数据框的样例开始解释会更容易:

    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

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

我的想法是使用 df.round 将列标题四舍五入到最接近的整数,然后使用 .mean() 在 axis=0 上应用相同列标题的平均值。但是,当我在数据框索引类型上使用 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()

它搞乱了列名以及值,而不是根据列名给我平均值...我也不知道为什么!


好的,如果你需要对一个答案进行澄清,请提出你的问题。谢谢。 - cs95
6个回答

12

使用 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
如果不是那个,你在寻找什么? - Andrew
@Brain_overflowed,这与您发布的预期输出完全相同。如果有什么问题,您必须解释原因。我建议您在放弃之前先尝试答案... - cs95

6

重命名列并进行类型转换,将 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

5

使用np.floorrenamegroupby

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

2
@cᴏʟᴅsᴘᴇᴇᴅ 我仍然更喜欢你的解决方案~ :-) - BENY
1
OPs是善变的动物。他们不知道自己想要什么。 - cs95
1
@Brain_overflowed 这是一个问题一年之后.. 哈哈 - BENY
@Wen 我知道...很抱歉,但我以前对Python不熟悉,不知道自己在做什么。现在我正在处理另一个项目,需要相同的东西。 - Brain_overflowed
1
问题太旧了,我认为不需要悬赏。并且所描述的解决方案有效。 - shiv_90
显示剩余3条评论

3
另一种方法是通过 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

1
抱歉耽搁了,Uv'd。 - cs95

3

通用解决方案

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

为什么这样更好? - Yuca
1
我非常怀疑这是真的。请不要进行虚假宣传,你不能决定你的解决方案是否更好。让原帖作者和投票者来决定。也不要乞求点赞,这在这里是不好的行为。 - cs95
谢谢@coldspeed,我会记住这件事的 :) - HimanshuGahlot

2

要将列值四舍五入到最近的整数,您可以在列表推导式上进行分组,该列表推导式将每个列(除第一个列 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接