如何在Pandas数据帧中将复制分组为列



我有一个带有复制的数据集,我需要从类似的东西开始

S1   S1   S2   S2
S1.1 S1.2 S2.1 S2.2
Ion1  10   8    14   1
Ion2  0    6    2    3

前两行是多级标头。s1和S2是样本,s1.1等是该样本的重复测量的文件名。它们不会是如所示的简单名称

我需要去类似的地方

Rep1 Rep2
Ion1 S1 10   8
Ion1 S2 14   1
Ion2 S1 0    6
Ion2 S2 2    3

其中rep1和rep2通常表示第一次和第二次重复测量,并且样品行是堆叠的。

最后,我想计算复制的平均值。现在,我正在一个numpy矩阵中进行此操作,并在输入矩阵中插入一行带有rep编号的行,然后将其导入panda中,但这是不雅的,我宁愿在数据帧中进行

编辑:我觉得我有点困惑。当我说名字不简单时,它们不会是S1.1,它们可能是XF20114,S1.2可能是XF19372 CF,S1可能被称为"florida",所以不能依赖名称的最后一个数字。现在,我只需滚动numpy矩阵中的样本行,如果样本号与前一个相同,则在新行中放入一个递增的数字。如果样本名称发生变化,则将数字设置为1。这使得示例中的表看起来像:

S1   S1   S2   S2
S1.1 S1.2 S2.1 S2.2
1    2    1    2
Ion1  10   8    14   1
Ion2  0    6    2    3

无论复制名称是什么,我都可以对离子具有相同样本名称的所有值进行分组吗?

# stack the first level
df_s = df.stack(level=0)
# groupby the last string in the cols and sum
df_s.groupby(df_s.columns.str[3:], axis=1).sum()
1    2
0                 
Ion1 S1  10.0  8.0
S2  14.0  1.0
Ion2 S1   0.0  6.0
S2   2.0  3.0

这是一个替代方案:

df.columns = pd.MultiIndex.from_tuples((first, last.split('.')[-1]) for first, last in df.columns)
df.stack(0).add_prefix('Rep')
Rep1 Rep2
Ion1    S1  10  8
S2  14  1
Ion2    S1  0   6
S2  2   3

最新更新