【问题标题】:Pandas: combining results from function on subset of dataframe with the original dataframePandas:将数据帧子集上的函数结果与原始数据帧相结合
【发布时间】:2018-01-15 20:41:48
【问题描述】:

我是 Pandas 的新手,所以请原谅我缺乏经验。 尽管如此,我已经在这里解决了我的问题的很多部分。

为简单起见,我们以Quantile Normalization 上的 wiki 文章为例:

A    5    4    3
B    2    1    4
C    3    4    6
D    4    2    8

并更新它以适应我正在处理的数据结构:

df = pd.DataFrame({
        'gene': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f'],
        'rep': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
        'val': [5, 4, 3, 2, 1, 4, 3, 4, 6, 4, 2, 8, 0, 1, 0, 0, 2, 4],
        'subset':['y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'n', 'n', 'n', 'n', 'n', 'n'] 
})


    gene rep subset val
0   a   1   y   5
1   a   2   y   4
2   a   3   y   3
3   b   1   y   2
4   b   2   y   1
5   b   3   y   4
6   c   1   y   3
7   c   2   y   4
8   c   3   y   6
9   d   1   y   4
10  d   2   y   2
11  d   3   y   8
12  e   1   n   0
13  e   2   n   1
14  e   3   n   0
15  f   1   n   0
16  f   2   n   2
17  f   3   n   4

这种扁平结构可能看起来很奇怪且效率低下(至少是多余的),但对于我的特定用例 - 这是最好的选择 - 所以请放心使用。

在这个例子中,我们想要对原始数据(基因 a - d)运行分位数归一化,所以我们抓取子集(在某些元数据键上获取子集):

sub = df[df.subset == 'y']

形状仍然关闭,所以使用pivot 函数,正如我最近从@Wan 从我的GroupBy question 那里学到的:

piv = sub.pivot(index='gene', columns='rep', values='val')

rep 1   2   3
gene            
a   5   4   3
b   2   1   4
c   3   4   6
d   4   2   8

这会导致其他列丢失,这些列可能与以后相关,也可能不相关。 继续,使用我可以处理混合数据帧的quantile normalization 函数:

quantile_normalize(piv, [1, 2, 3])

rep     1   2   3
gene            
a   5.666667    4.666667    2.000000
b   2.000000    2.000000    3.000000
c   3.000000    4.666667    4.666667
d   4.666667    3.000000    5.666667

这是 wiki 的预期结果:

A    5.67    4.67    2.00
B    2.00    2.00    3.00
C    3.00    4.67    4.67
D    4.67    3.00    5.67

整洁。

现在我的问题

如何获取这些值并将它们重新插入到原始数据框中?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    您可以在melt-ing 您的结果数据框之后将您的结果merge 返回到原始数据框:

    result = quantile_normalize(piv, [1, 2, 3])
    result = result.reset_index().melt(id_vars='gene', value_name='quantile')
    result
    >>>   gene rep  quantile
    0     a   1         5.666667
    1     b   1         2.000000
    2     c   1         3.000000
    3     d   1         4.666667
    4     a   2         4.666667
    5     b   2         2.000000
    6     c   2         4.666667
    7     d   2         3.000000
    8     a   3         2.000000
    9     b   3         3.000000
    10    c   3         4.666667
    11    d   3         5.666667
    
    df = pd.merge(df, result, on=['gene', 'rep'], how='outer')
    df 
    >>>    gene  rep subset  val  quantile
    0     a    1      y    5  5.666667
    1     a    2      y    4  4.666667
    2     a    3      y    3  2.000000
    3     b    1      y    2  2.000000
    4     b    2      y    1  2.000000
    5     b    3      y    4  3.000000
    6     c    1      y    3  3.000000
    7     c    2      y    4  4.666667
    8     c    3      y    6  4.666667
    9     d    1      y    4  4.666667
    10    d    2      y    2  3.000000
    11    d    3      y    8  5.666667
    12    e    1      n    0       NaN
    13    e    2      n    1       NaN
    14    e    3      n    0       NaN
    15    f    1      n    0       NaN
    16    f    2      n    2       NaN
    17    f    3      n    4       NaN
    

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2019-08-17
      • 2018-09-04
      • 1970-01-01
      • 2020-02-04
      • 2017-05-04
      相关资源
      最近更新 更多