如果我没有提供最小的工作示例,请原谅我,但我不能复制一个(我试过了大约一个小时)。
给出以下索引:
df_original.columns
MultiIndex(levels=[['ft', 'load', 's0', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8'], ['260', '280', '603', 'buffer', 'pH', 'salt', 'salt_concentration', 'sample_volume', 'volume']],
labels=[[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 1, 1, 1, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 0, 0, 0], [3, 4, 5, 6, 8, 7, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 3, 4, 5, 6, 8, 8, 6, 3, 4, 5, 0, 1, 2, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1]],
names=['steps', 'data'])
我想通过正则表达式匹配从多索引中提取数据:
mask = gr.columns.get_level_values(1).str.match(r'^\d{3}')
df = gr.loc[:,mask].copy()
产生所需的输出。
当我看到:
df.get_level_values(1)
一切看起来都像预期的那样。
Index(['260', '280', '603', '603', '260', '280', '603', '260', '280', '603',
'260', '280', '603', '260', '280', '603', '260', '280', '603', '260',
'280', '603', '260', '280', '603', '260', '280', '603', '260', '280',
'603', '260', '280'],
dtype='object', name='data')
然而
df.columns
仍然看起来像原始数据框df_original
MultiIndex(levels=[['ft', 'load', 's0', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8'], ['260', '280', '603', 'buffer', 'pH', 'salt', 'salt_concentration', 'sample_volume', 'volume']],
labels=[[1, 1, 1, 10, 10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 0, 0, 0], [0, 1, 2, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1]],
names=['steps', 'data'])
所有这一切都是一种奇怪的行为:
我想将信息添加到切片(和复制)的数据帧中。我通过循环来做到这一点:
steps = df.columns.get_level_values('steps').unique().tolist()
for step in steps:
df[step, 'a.pH'] = 1
df[step, 'a.salt_concentration'] = 2
df[step, 'a.buffer'] = 3
到目前为止一切都很好:
df.stack('steps')
堆栈操作后。所有排除的列再次可见(通过以下方式排除:
gr.columns.get_level_values(1).str.match(r'\d{3}')
)
为什么会这样,我怎么能避免这种奇怪的行为?
编辑:
原始数据(部分内容):https://pastebin.com/WLjP2ws3
解决方法是之后使用df.dropna(axis=1, how='all')