2016-10-04 107 views
2

我有一個多列的數據框,就像一個在以下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遏制。這可能嗎?

回答

1

創建DF映射列名到它的多指標DF水平:

level_df = pd.DataFrame(df.columns.values.tolist(), columns=np.array(df.columns.names)) 
level_df 

Image

創建另一個DF這使我們的含http://stardict.sourceforge.net/Dictionaries.php下載的列表中選擇所需的映射:

keep = pd.DataFrame(to_keep) 
keep 

Image

串連兩個DFs逐行:

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

注:這是假設字典的鍵匹配多指標列名。