2017-04-03 147 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

相关问题