【发布时间】:2020-03-31 01:32:18
【问题描述】:
两个实验室进行了一系列测量:
- 在已知仪器显示不同响应的三个实验条件下(
test_1、test_2、test_3) - 使用两种不同品牌和型号的乐器(foo、bar)
- 在他们拥有的每个仪器型号的多个副本上重复他们的测量,这些副本具有单独的序列号,并包括对他们相互借用以进行实验室间比较的仪器的测量(在两个实验室测量的序列号相同)。
这两个实验室现在希望将他们所有的数据集中在一起,并从他们的组合数据集中对这两种仪器的属性得出一些结论。首先,他们希望查看 Seaborn 分类图中的所有数据。
稍微改编自 Pandas cookbook examples on MultiIndexing 这是每个实验室交流数据的方式:
import pandas as pd
import seaborn as sns
from matplotlib import pyplot
df = pd.DataFrame({'test': ['test_1', 'test_2' ,'test_3'],
'foo_110': [1.1, 1.18, 1.19],
'foo_112': [1.15, 1.25, 1.25],
'bar_888': [1.11, 1.15, 1.16],
'bar_657': [1.14, 1.16, 1.18]}
)
df1 = pd.DataFrame({'test': ['test_1', 'test_2' ,'test_3'],
'foo_105': [1.13, 1.17, 1.18],
'foo_112': [1.16, 1.26, 1.28],
'foo_167': [1.18, 1.23, 1.27],
'bar_888': [1.10, 1.14, 1.18],
'bar_415': [1.12, 1.15, 1.16]}
)
为了为他们的 Seaborn 图准备数据,数据框在其索引 stacked() 中重新组织,并沿 axis = 0 连接:
df = df.set_index('test')
df.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
df = df.stack().reset_index()
df1 = df1.set_index('test')
df1.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df1.columns])
df1 = df1.stack().reset_index()
dfAll = pd.concat((df, df1), axis = 0, sort= False)
dfAll.columns = ['test', 's.no.', 'bar', 'foo']
生产
print(dfAll.head(10))
test s.no. bar foo
0 test_1 110 NaN 1.10
1 test_1 112 NaN 1.15
2 test_1 657 1.14 NaN
3 test_1 888 1.11 NaN
4 test_2 110 NaN 1.18
5 test_2 112 NaN 1.25
6 test_2 657 1.16 NaN
7 test_2 888 1.15 NaN
8 test_3 110 NaN 1.19
9 test_3 112 NaN 1.25
为“条形”工具绘制所有数据:
sns.set(style="whitegrid")
dfAllplot = sns.catplot(x="test", y ="bar", data=dfAll, hue='s.no.')
这两个实验室现在想要做的是保持他们区分来自Lab_1 和Lab_2 的数据点的能力,以及使用两个实验室提供的其他信息,其中包括误差线,test_1、test_2 和 test_3 是不同的。
通过在df 和df1 重置它们的索引之后和连接之前添加一列来轻松提供实验室数据。
df['Lab'] = 'Lab_1'
df1['Lab'] = 'Lab_2'
我没有解决的问题是如何在为每个test_x 提供附加信息时保留stacking() 之后的数据。在将Index 重新排列为MultiIndex 后添加具有相对不确定性的列df1['urel']:
df1 = df1.set_index('test')
df1.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df1.columns])
df1['urel'] = [0.015, 0.014, 0.013]
产量
df1
Out[137]:
foo bar urel
105 112 167 888 415
test
test_1 1.13 1.16 1.18 1.10 1.12 0.015
test_2 1.17 1.26 1.23 1.14 1.15 0.014
test_3 1.18 1.28 1.27 1.18 1.16 0.013
然后
df1 = df1.stack().reset_index()
df1['Lab'] = 'Lab_2'
为'Lab' 列产生想要的结果,但不是'urel',它只为某些行携带原始值,不能用于进一步的绘图指令。
print(df1.head(10))
test level_1 bar foo urel Lab
0 test_1 105 NaN 1.13 NaN Lab_2
1 test_1 112 NaN 1.16 NaN Lab_2
2 test_1 167 NaN 1.18 NaN Lab_2
3 test_1 415 1.12 NaN NaN Lab_2
4 test_1 888 1.10 NaN NaN Lab_2
5 test_1 NaN NaN 0.015 Lab_2
6 test_2 105 NaN 1.17 NaN Lab_2
7 test_2 112 NaN 1.26 NaN Lab_2
8 test_2 167 NaN 1.23 NaN Lab_2
9 test_2 415 1.15 NaN NaN Lab_2
什么时候应该将'urel' 添加到数据框中?
如果在 MultiIndexing 之前添加,即从一开始,多索引、堆叠和重置,就像这里所做的那样再次“中断”'urel'。
或者stack() 不是此处提供的示例的正确方法?
【问题讨论】: