pandas与multiindex列loc和get_level_values混淆

时间:2017-09-27 20:36:48

标签: python pandas

如果我没有提供最小的工作示例,请原谅我,但我不能复制一个(我试过了大约一个小时)。

给出以下索引:

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')

0 个答案:

没有答案