Python 如何在dataframe中将复制分组为列
我有一个复制数据集,我需要这样做Python 如何在dataframe中将复制分组为列,python,pandas,numpy,Python,Pandas,Numpy,我有一个复制数据集,我需要这样做 S1 S1 S2 S2 S1.1 S1.2 S2.1 S2.2 Ion1 10 8 14 1 Ion2 0 6 2 3 Rep1 Rep2 Ion1 S1 10 8 Ion1 S2 14 1 Ion2 S1 0 6 Ion2 S2 2 3 前两行是多级标题。s1和S2是样本,s1.1等是该样本的复制测量的文件名。它们不会是这里显示的简单
S1 S1 S2 S2
S1.1 S1.2 S2.1 S2.2
Ion1 10 8 14 1
Ion2 0 6 2 3
Rep1 Rep2
Ion1 S1 10 8
Ion1 S2 14 1
Ion2 S1 0 6
Ion2 S2 2 3
前两行是多级标题。s1和S2是样本,s1.1等是该样本的复制测量的文件名。它们不会是这里显示的简单名称
我需要去这样的地方
S1 S1 S2 S2
S1.1 S1.2 S2.1 S2.2
Ion1 10 8 14 1
Ion2 0 6 2 3
Rep1 Rep2
Ion1 S1 10 8
Ion1 S2 14 1
Ion2 S1 0 6
Ion2 S2 2 3
其中rep1和rep2通常表示第一次和第二次重复测量,样本行被堆叠
最后我想计算复制的平均值。现在,我在一个numpy矩阵中执行此操作,并在输入矩阵中插入一行rep编号,然后将其导入pandas,但这并不美观,我更愿意在数据框中执行此操作
编辑:
我想我有点困惑。当我说名字不简单的时候,它们不是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