我是熊猫的新手,所以请原谅我的经验不足。很难确切地解释我的问题是什么,所以我将引导您完成一个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_1
和ind_2
是两个自变量,out_1
和out_2
是响应改变自变量而进行的两个测量。
此外,对于自变量的每个组合,都有技术重复(在本例中为 2)。
我想跨ind_1
分位数归一化,即分位数归一化数据ind_1 == 'a'
然后再次归一化ind_1 == 'b'
。
因此,我解决这个问题的路线图如下:
- 获取要跨分位数规范化的数据子集 取
- 技术重复的平均值(在这种情况下,我们将取
out_1
和out_2
的中值按ind_2
分组) - 分位数对此矩阵进行归一化
- 与其他元数据合并(为简单起见,未显示其他列)
- 对所有值重复 1-4
ind_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_z
out_1_mean
和z
)和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