2014-09-20 66 views
0

我想從df1中提取df2(標識是索引)中不存在的行。對於下面的例子,我期望返回df1中的第一行。不幸的是,結果是空的。獲取存在於一個數據框中的行,但不存在其他行

import pandas as pd 

df1 = pd.DataFrame({ 
    'level-0': ['a', 'a', 'a', 'a', 'a', 'a'], 
    'level-1': ['s2', 's2', 's2', 's2', 's2', 's2'], 
    'level-2': ['1', '1', '1', '1', '1', '1'], 
    'level-3': ['19', '20', '21', '22', '23', '24'], 
    'level-4': ['HRB', 'HRB', 'HRB', 'HRB', 'HRB', 'HRB'], 
    'name': ['a', 'b', 'c', 'd', 'e', 'f'] 
}) 

df1 = df1.set_index(['level-0', 'level-1', 'level-2', 'level-3', 'level-4'], drop=False) 

df2 = pd.DataFrame({ 
    'level-0': ['a', 'a', 'a', 'a', 'a', 'b'], 
    'level-1': ['s2', 's2', 's2', 's2', 's2', 's2'], 
    'level-2': ['1', '1', '1', '1', '1', '1'], 
    'level-3': ['19', '20', '21', '22', '23', '24'], 
    'level-4': ['HRB', 'HRB', 'HRB', 'HRB', 'HRB', 'HRB'] 
}) 
df2 = df2.set_index(['level-0', 'level-1', 'level-2', 'level-3', 'level-4'], drop=False) 

# all indices that are in df1 but not in df2 
df_unknown = df1[~df1.index.isin(df2.index)] 
print df_unknown 

選擇有什麼問題?

更新

我想通了,出了什麼問題。數據幀是從Excel文件讀取的,一些Series被解釋爲int,而要比較的數據幀已將其列轉換爲str。這導致了不同的指數。

回答

1

​​默認情況下不存在,所以df1df2在調用後仍然有它們的數字索引。無論是做

df2.set_index(..., inplace=True) 

df2 = df2.set_index(...) 

你會看到,迄今爲止在大熊貓的最方法工作方式。

+0

奇怪。我在我的實際代碼中有'df = df.set_index()',並且在最小的例子中出錯了。不知道爲什麼實際的代碼不工作... – orange 2014-09-20 09:28:19

相關問題