2017-04-03 142 views
1

我剛在stackoverflow上花了一個小時尋找類似的問題,所以請原諒,如果這已被問及之前,我沒有找到它。Python熊貓標記匹配一個數據幀中的列到另一個數據幀中的列的值

我有以下的數據幀DF:

Id | Category | Subcategory | Count | Flag | Phone_number 
    1  A   aa  4534  Y  222-444-3333 
    2  B   bb  4807  Y  3335557777 
    3  C   cc  8978   222-444-3333 
    4  D   dd  9874   333-555-7777 
    5  E   ee  3187   555-666-8888 
    6  F   ff  8573   5556668888 

列 「標誌」 表示建立不正確的記錄。現在我需要標記/突出顯示所有具有相同電話號碼的記錄,即使它們沒有標記。

首先,我需要從電話號碼中取出所有「 - 」,因爲它已經由用戶輸入。

df['Phone_number'] = df['Phone_number'].str.replace('-', '') 

(不知道這是最好的辦法)

接下來,我想不出更好的方式來處理它,然後創建的DF與Y標誌,並沒有在Y標誌記錄的新。

new_df = df.loc[df['Flag'] == 'Y'] 
df_withoutY = df.loc[df['Flag'] != 'Y'] 

但現在我卡住了。如何比較/匹配df_withoutY中的電話號碼,如果它存在於new_df中,則添加一個新的列「不正​​確」=「Y」。

我在想這樣的事情,但得到了所有的錯誤。

df_withoutY['Phone_number'].isin(new_df['Phone_number']) 

這並沒有在所有的工作:

df_withoutY['incorrect'] = np.where((df_withoutY['Phone_number'].isin(new_df['Phone_number'])) == True, "Y" " ") 

TypeError: invalid type comparison 

不知道,如果這是有益的,但在Excel中,我會由拆分旗兩成兩個單獨的選項卡,然後使用匹配功能。

=MATCH(df_withoutY!AK2,new_df!AK$2:AK$3395,0) 

一旦我這樣做了,我一直在計劃將兩個dfs重新合併在一起,但是現在有了新列「不正確」。如果沒有分裂數據框的方法會更好。

這是最終目標DF:

Id | Category | Subcategory | Count | Flag | Phone_number | incorrect 
    1  A   aa  4534  Y  222-444-3333 
    2  B   bb  4807  Y  3335557777 
    3  C   cc  8978   222-444-3333  Y 
    4  D   dd  9874   333-555-7777  Y 
    5  E   ee  3187   555-666-8888 
    6  F   ff  8573   5556668888 

謝謝

+0

當我有機會,我會採取更深入的瞭解。 – piRSquared

回答

1

試試這個:

In [219]: phones_normalized = df.Phone_number.str.replace('-','') 

In [220]: df['incorrect'] = \ 
    ...: np.where(phones_normalized.isin(df.loc[df.Flag=='Y', 'Phone_number'].str.replace('-','')) 
    ...:   & (df.Flag!='Y'), 
    ...:   'Y', 
    ...:   '') 
    ...: 

In [221]: df 
Out[221]: 
    Id Category Subcategory Count Flag Phone_number incorrect 
0 1  A   aa 4534 Y 222-444-3333 
1 2  B   bb 4807 Y 3335557777 
2 3  C   cc 8978  222-444-3333   Y 
3 4  D   dd 9874  333-555-7777   Y 
4 5  E   ee 3187  555-666-8888 

或者你可以 「重用」 你Flag列:

In [226]: df.loc[df.Phone_number.str.replace('\D+','').isin(df.loc[df.Flag=='Y', 'Phone_number'].str.replace('\D+','')), 'Flag'] = 'Y' 

In [227]: df 
Out[227]: 
    Id Category Subcategory Count Flag Phone_number 
0 1  A   aa 4534 Y 222-444-3333 
1 2  B   bb 4807 Y 3335557777 
2 3  C   cc 8978 Y 222-444-3333 
3 4  D   dd 9874 Y 333-555-7777 
4 5  E   ee 3187  555-666-8888 
0

可以在每個數據幀上的電話號碼列中使用pandas.merge: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html

你可以做一個外連接,然後使用你已經知道的df.loc功能。

只要確保您在連接之前以相同的方式預處理電話號碼,以便它們具有相同的格式和數據類型。

+0

非常抱歉 - 但我不明白,爲什麼我要合併兩個剛剛分割的數據幀 - 我需要建立一種方法將一個數據幀中的電話號碼與另一個數據幀中的電話號碼相匹配 – jeangelj

+0

如果合併他們回到一起並創建一個新的數據框架,這將與兩個數據框中的電話號碼相匹配。 – gaw89

相關問題