求连续列的平均值

2024-06-28 20:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的数据文件(数以万计的行和列),格式与此类似

name   x  y gh_00hr_bio_rep1 gh_00hr_bio_rep2 gh_00hr_bio_rep3 gh_06hr_bio_rep1
gene1  x  y         2               3               2               1
gene2  x  y         5               7               6               2

我对每个基因的目标是找出每组重复的平均值

最后,我只希望有一些列的平均值标题像“00hr_bio”,并删除所有的个人重复

我现在的想法是这样:

for row in df:
    df[avg] = df.iloc[3:].rolling(window=3, axis=1).mean() 

但我不知道如何真正做到这一点

df.iloc[3]是我尝试从第三列开始的方式,但我相当肯定这样做是行不通的

我甚至不知道从哪里开始“合并”3列到1列

如果您有任何建议,我将不胜感激,因为我显然不知道我在做什么


Tags: namedf数据文件格式基因ghbio平均值
2条回答

你很接近

df['avg'] = df.iloc[:, 2:].mean(axis=1)

你会得到这个:

       x  y  gh_00hr_bio_rep1  gh_00hr_bio_rep2  gh_00hr_bio_rep3  gh_06hr_bio_rep1  avg
gene1  x  y                 2                 3                 2                 1  2.0
gene2  x  y                 5                 7                 6                 2  5.0

如果您希望从不同的列集合中获得平均值,可以执行以下操作:

for col in range(10):
    df['avg%i' % col] = df.iloc[:, 2+col*5:7+col*5].mean(axis=1)

如果每个平均值的列数相同。否则,您可能需要使用rep列的名称,这取决于数据的外观

我将首先构建一系列由原始列索引的最终名称:

names = pd.Series(['_'.join(i.split('_')[:-1]) for i in df.columns[3:]],
                  index = df.columns[3:])

然后我会用它来询问轴1上的groupby的平均值:

tmp = df.iloc[:, 3:].groupby(names, axis=1).agg('mean')

它提供了一个与原始数据帧相似的索引新数据帧,并具有平均列:

   gh_00hr_bio  gh_06hr_bio
0     2.333333          1.0
1     6.000000          2.0

然后,您可以将其水平连接到第一个数据帧或其前3列:

result = pd.concat([df.iloc[:, :3], tmp], axis=1)

要获得:

    name  x  y  gh_00hr_bio  gh_06hr_bio
0  gene1  x  y     2.333333          1.0
1  gene2  x  y     6.000000          2.0

相关问题 更多 >