2015-10-15 81 views
1

我有兩個數據幀df1df2,每列一列。我想逐行比較它們,並且如果列中的值匹配,則使用所有匹配的值創建新的數據框。如果沒有創建一個包含2列的數據幀以獲得不匹配的值。比較2個數據幀並製作一個新的數據幀

equal_index = [] 
equal_df1 = [] 
not_equal_index = [] 
not_equal_df1 = [] 
not_equal_df2 = [] 

for x in df1.index.tolist(): 
    if df1['column'].ix[x] == df2['column'].ix[x]: 
     equal_index.append(x) 
     equal_df1.append(df1['column'].ix[x]) 
    else: 
     not_equal_index.append(x) 
     not_equal_df1.append(df1['column'].ix[x]) 
     not_equal_df2.append(df2['column'].ix[x]) 

DF_equal = pd.DataFrame({"column":equal_df1}, index = equal_index) 
DF_not_equal = pd.DataFrame({'column1':not_equal_df1,'column2':not_equal_df2}, index = not_equal_index) 

現在看來似乎應該是工作,但我得到一個錯誤:ValueError: the truth value of a Series is ambiguous.

另外,如果我嘗試一些基本

for x in df1.index.tolist(): 
    print df1['column'].ix[x] == df2['column'].ix[x] 

我得到TrueFalse儘可能多X的,因爲我有

如果我使用is而不是==,則將得到中的所有值。

+0

現在試試吧,我之前沒有在'append'中使用'loc'。 – Leb

回答

1
import pandas as pd 

df = pd.DataFrame({0:['test','test2','test3'], 1:['foo','foo2','foo3'], 2:['bar','bar2', 'bar3']}) 

df2 = pd.DataFrame({0:['test','test2','test4'], 1:['foo','foo2','foo3'], 2:['bar','bar2', 'bar3']}) 

df_equal = pd.DataFrame() 

df_not_equal = pd.DataFrame() 

for i in range(df.shape[0]): 
    if all(df.loc[i].values==df2.loc[i].values): 
     df_equal = df_equal.append(df.loc[i], ignore_index=True) 
    else: 
     df_not_equal['A'] = df.loc[i] 
     df_not_equal['B'] = df2.loc[i] 

print(df_equal) 

print(df_not_equal) 

會給你:

 0  1  2 
0 test foo bar 
1 test2 foo2 bar2 
     A  B 
0 test3 test4 
1 foo3 foo3 
2 bar3 bar3 

看着你提供的錯誤,問題就出在if df1['column'].ix[x] == df2['column'].ix[x]:pandas不允許這種類型的比較,這就是爲什麼他們說「模棱兩可」。

通過使用該行的實際值來解決問題,並且您需要檢查allany(這些是我自己的解釋,希望)。

+0

我希望我的'df_not_equal'具有來自兩個數據框的列。現在它只是附加額外的行。但'df_equal'正常工作。 但我仍然無法弄清楚我的代碼有什麼問題 – AK9309

+0

檢查我的編輯和我的解釋。 – Leb