Python pandas标记将一个数据帧中的列与另一个数据帧中的列匹配

时间:2017-04-03 21:11:10

标签: python pandas conditional match

我刚刚在stackoverflow上花了一个小时寻找类似的问题,所以请原谅我是否曾经问过这个问题而且我没有找到它。

我有以下数据框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

“Flag”列表示已建立的错误记录。现在我需要标记/突出显示具有相同电话号码的所有记录,即使它们没有标记。

首先,我需要从电话号码中取出所有“ - ”,因为它已由用户输入。

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

(不确定这是最好的方式)

接下来,我想不出更好的方法来接近它然后用Y标志创建一个新的记录,而没有Y标志。

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

但现在我被卡住了。如何比较/匹配df_withoutY中的电话号码,如果它在new_df中存在,则添加新列“wrong”=“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

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以在每个数据框的电话号码列中使用pandas.merge: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html

您可以执行外连接,然后使用您已知的df.loc功能。

确保在加入之前以相同的方式预处理电话号码,以便它们具有相同的格式和数据类型。