我有一个包含多级列的数据框,例如以下 MWE 中的数据框:
df = pd.DataFrame([[1,2],[3,4]], columns=[['a','c'],['b','d']], index=['one','two'])
df.columns.names = ['aa', 'bb']
看起来像这样:
In [267]: df
Out[267]:
aa a c
bb b d
one 1 2
two 3 4
我还有一个字典列表,如下所示:
to_keep = [{'aa':'a', 'bb':'b'}, {'aa':'q', 'bb':'d'}]
我想做什么:
如果多级列标签在 to_keep
列表中,则将它们保留在 df
中,否则将它们从 df 中删除。
因此对于 df
和 to_keep
上面的结果数据帧看起来像:
aa a
bb b
one 1
two 3
因为 {'aa':'c', 'bb':'d'}
不包含在 to_keep
中。这可能吗?
最佳答案
创建一个 DF
将列名映射到多索引 DF
的级别:
level_df = pd.DataFrame(df.columns.values.tolist(), columns=np.array(df.columns.names))
level_df
创建另一个 DF
来保存我们需要的包含字典列表的映射:
keep = pd.DataFrame(to_keep)
keep
按行连接两个 DF
:
df_concat = pd.concat([level_df, keep], ignore_index=True)
df_concat
从连接的 DF
中删除所有重复项。在检查连接的 DF
中的剩余值是否存在于 level_df
中后放下级别:
cond = df_concat[~df_concat.duplicated(keep=False)]
df.drop([tuple(x) for x in cond[cond.isin(level_df).all(axis=1)].values], axis=1)
注意:这里假设字典的键与多索引列名匹配。
关于python - 从 Pandas 字典列表中删除多级列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39857148/