Pandas:对具有重复的扁平数据集的子集进行分位数归一化

  • 本文关键字:子集 Pandas 数据集 python pandas
  • 更新时间 :
  • 英文 :


我是熊猫的新手,所以请原谅我的经验不足。很难确切地解释我的问题是什么,所以我将引导您完成一个m.w.e。我的问题将以>标记突出显示(即黄色)

我有一个扁平的数据帧,如下所示:

import pandas as pd
df = pd.DataFrame({
'label': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2],                                        
'ind_1': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'],        
'out_1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],                                    
'out_2': [16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1],                                    
'ind_2': ['z', 'z','y', 'y', 'z', 'z', 'y', 'y', 'z', 'z', 'y', 'y', 'z', 'z', 'y', 'y']
#, and a whole lot of other columns         
})
df.head()
ind_1   ind_2   label   out_1   out_2
0   a   z   1   1   16
1   a   z   1   2   15
2   a   y   1   3   14
3   a   y   1   4   13
4   b   z   1   5   12

其中ind_1ind_2是两个自变量,out_1out_2是响应改变自变量而进行的两个测量。

此外,对于自变量的每个组合,都有技术重复(在本例中为 2)。

我想跨ind_1分位数归一化,即分位数归一化数据ind_1 == 'a'然后再次归一化ind_1 == 'b'

因此,我解决这个问题的路线图如下:

  1. 获取要跨分位数规范化的数据子集
  2. 技术重复的平均值(在这种情况下,我们将取out_1out_2的中值按ind_2分组)
  3. 分位数对此矩阵进行归一化
  4. 与其他元数据合并(为简单起见,未显示其他列)
  5. 对所有值重复 1-4ind_1

1 获取数据子集

sdf = df[df.ind_1 == 'a']
sdf.head()
ind_1   ind_2   label   out_1   out_2
0   a   z   1   1   16
1   a   z   1   2   15
2   a   y   1   3   14
3   a   y   1   4   13
8   a   z   2   9   8

还不错。

2 取重复的平均值

ind_2_means = sdf.groupby(['label', 'ind_2']).mean()

out_1   out_2
label   ind_2       
1   y           3.5     13.5
z           1.5     15.5
2   y           11.5    5.5
z           9.5     7.5

intermediate = ind_2_means.reset_index()

label   ind_2   out_1_mean  out_2_mean
0   1   y   3.5     13.5
1   1   z   1.5     15.5
2   2   y   11.5    5.5
3   2   z   9.5     7.5

piv = intermediate.pivot('label', 'ind_2')

out_1_mean      out_2_mean
ind_2   y       z       y       z
label               
1       3.5     1.5     13.5    15.5
2       11.5    9.5     5.5     7.5

我的分位数归一化函数要求它没有层次结构,即:

ind_2   out_1_mean_y    out_1_mean_z    out_2_mean_y    out_2_mean_z
label               
1       3.5     1.5     13.5    15.5
2       11.5    9.5     5.5     7.5

问题1:如何将piv转换为上述布局?(我们称这个变量为piv_flattened)

3 分位数归一化

qn = quantile_normalize(piv_flattened, ['out_1_mean_y', 'out_1_mean_z', 'out_2_mean_y', 'out_2_mean_z'])

# 与 piv_flattened 具有相同的布局,只是分位数归一化

4 与原始数据合并

我怎样才能

1.) 从此布局返回到intermediate布局(例如,将键拆分out_1_mean_zout_1_meanz)和

2.) 将其与原始数据合并回来?

这可能必须修改此处提供的答案

5 对其他子集重复此操作

我将 1-4 封装到一个函数中

欢迎其他方法,任何优化(以及解释它们为什么有效)将不胜感激。

预期成果

这是预期输出的形式,存在冗余,因为您必须广播均值,但这会保留其他列中的数据

ind_1   ind_2   label   out_1   out_2 out_1_mean out_2_mean    ... <all-non-shown-columns>
0   a   z   1   1   16  <a_z_out_1_mean_qn>     <a_z_out_2_mean_qn>
1   a   z   1   2   15  <a_z_out_1_mean_qn>     <a_z_out_2_mean_qn>
2   a   y   1   3   14  <a_y_out_1_mean_qn>     <a_y_out_2_mean_qn>
3   a   y   1   4   13  <a_y_out_1_mean_qn>     <a_y_out_2_mean_qn>
4   b   z   1   5   12  <b_z_out_1_mean_qn>     <b_z_out_2_mean_qn>

给你第一个问题

piv.columns=piv.columns.map('_'.join)
piv
Out[431]: 
out_1_y  out_1_z  out_2_y  out_2_z
label                                    
1          3.5      1.5     13.5     15.5
2         11.5      9.5      5.5      7.5

最新更新