python - 从 Pandas 字典列表中删除多级列

标签 python pandas multi-index

我有一个包含多级列的数据框,例如以下 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 中删除。

因此对于 dfto_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

Image

创建另一个 DF 来保存我们需要的包含字典列表的映射:

keep = pd.DataFrame(to_keep)
keep

Image

按行连接两个 DF:

df_concat = pd.concat([level_df, keep], ignore_index=True)
df_concat

Image

从连接的 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)

Image

注意:这里假设字典的键与多索引列名匹配。

关于python - 从 Pandas 字典列表中删除多级列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39857148/

相关文章:

python - 在 Django/Jinja2 模板中将字典对象转换为字符串

python - 堆叠 MultiIndex 的所有级别

python - 带有 q 列表的多级列 MultiIndex groupby 对象上的 Pandas 分位数

python - A[1 :3][0:2] and A[1:3, 0:2] 之间的区别

python - 使用 matplotlib.pyplot 使标记大小尽可能小

python - 来自字典列表的字典的数据框?

python - 如何对 pandas DataFrame 中的内部列表进行排序?

python - Pandas 数据框分组并加入

python - pandas:绘制 DataFrame 时未显示 MultiIndex

python - Pandas 和 IPython 的变量可见性问题