gpt4 book ai didi

python - Pandas:将数据帧子集上的函数结果与原始数据帧相结合

转载 作者:太空宇宙 更新时间:2023-11-03 14:14:44 25 4
gpt4 key购买 nike

我是 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']

形状仍处于关闭状态,因此请使用我最近从我的GroupBy question中的@Wan那里学到的pivot函数。 :

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

整齐。

现在我的问题:

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

最佳答案

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

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

关于python - Pandas:将数据帧子集上的函数结果与原始数据帧相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48261087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com