2015-04-21 31 views
1

使用熊貓,我有一個數據幀,看起來像這樣:比較多組列的產生布爾結果列

col_a col_b col_a1 col_b1 
Larry Larry  Peter  Peter 
Lee  Lee  Jeremy Ilia 

我想比較col_acol_b,並col_a1col_b1。如果兩個對匹配,則在新列中指示它(flag):

col_a col_b col_a1 col_b1 flag 
Larry Larry  Peter  Peter True 
Lee  Lee  Jeremy Ilia  False 

我該怎麼做?

回答

0

您可以使用DataFrame.eval

import pandas as pd 

df = pd.DataFrame({ 
    "col_a":["Larry","Lee"], 
    "col_b":["Larry","Lee"], 
    "col_a1":["Peter","Jeremy"], 
    "col_b1":["Peter","Ilia"] 
    }) 

print df 
df["flag"] = df.eval("col_a==col_b and col_a1==col_b1")  
print df 

輸出:

col_a col_a1 col_b col_b1 
0 Larry Peter Larry Peter 
1 Lee Jeremy Lee Ilia 

    col_a col_a1 col_b col_b1 flag 
0 Larry Peter Larry Peter True 
1 Lee Jeremy Lee Ilia False 

如果碰巧要比較的列存儲在a_colsb_cols兩個列表中,您可以做一些事情荷蘭國際集團這樣的:

a_cols = ["col_a","col_a1"] 
b_cols = ["col_b","col_b1"] 
df["flag"] = df.eval(" and ".join("%s==%s" % pair for pair in zip(a_cols,b_cols))) 
print df 

輸出:

col_a col_a1 col_b col_b1 flag 
0 Larry Peter Larry Peter True 
1 Lee Jeremy Lee Ilia False 
+0

它看起來像col_a,col_b是int df.eval的硬代碼,我們有一種方法可以按對循環列嗎?我們如何做到這一點? –

+0

@LarryWoo你究竟想幹什麼?請給出更多細節,或者提出另一個問題,我會盡力幫助你;) –

+0

例如,我們不清楚Dataframe中的列號,它是動態的,我會通過函數讀取列,獲取所有列和存儲在列表中,然後試圖通過對來比較數據,我如何循環List並使df.eval()工作? –

1

您可以使用應用功能:

import pandas as pd 

df = pd.DataFrame({'col_a':('A','B'), 'col_b':('A','B'), 'col_a1':('C','D'),'col_b1':('C','E')}) 

df = df[['col_a','col_b','col_a1','col_b1']] 

df['flag'] = df.apply(lambda x: ('True' if x['col_a']== x['col_b'] and x['col_a1']==x['col_b1'] else 'False'),axis=1) 

print df 
+0

' 'col_a1'( 'C', 'd')'應該是''col_a1':('C','D')'這種方法限制了它的兩列比較,OP的輸入可以有多列。 – Zero

+0

謝謝你的收穫。我的代碼看起來很好,所以我必須複製它,並意外刪除了冒號。 – bsheehy

0

我發現下面的代碼要簡單得多讀通過。 你只需要比較在同一時間兩列and兩個結果得到flag列:

在一個行:

In [18]: tf['flag'] = (tf['col_a'] == tf['col_b']) & (tf['col_a1'] == tf['col_b1']) 

In [19]: tf 
Out[19]: 
    col_a col_b col_a1 col_b1 flag 
0 Larry Larry Peter Peter True 
1 Lee Lee Jeremy Ilia False