Pandas - 合并/加入/vlookup df 并删除所有匹配的行

000*_*004 3 python join pandas

我试图从一个电子表格(df name = data2)中引用过期订单列表,并在新订单电子表格(df name = data)上查找它们以删除包含过期订单的所有行。然后返回一个新的电子表格(df name = results)。

我在尝试模仿我在 Pandas 中的 excel vloookup/sort/delete 中所做的事情时遇到了麻烦。请查看伪代码/步骤为代码:

  1. 导入 simple.xls 作为名为“data”的数据框
  2. 导入 wo.xlsm,工作表名称“T”作为名为“data2”的数据框
  3. 执行 vlookup ,使用“数据”中的“A”列作为要与“data2”的“A”列中的任何相同值匹配的值(两者都只有订单 ID)

  4. 对于存在于 'data2' 中的 A 列内且也存在于 'data' 的“A”列中的所有值,分组(如有必要)并为列中找到的每个匹配的订单 ID 删除整行(有 26 列)两个数据集的 A。重申一下,删除“数据”文件中找到的匹配项的整行。将较小的数据集保存为结果。


    import pandas as pd
    data = pd.read_excel("ors_simple.xlsx", encoding = "ISO-8859-1", 
    dtype=object)
    data2 = pd.read_excel("wos.xlsm", sheet_name = "T")
    results = data.merge(data2,on='Work_Order')
    writer = pd.ExcelWriter('vlookuped.xlsx', engine='xlsxwriter')
    results.to_excel(writer, sheet_name='Sheet1')
    writer.save()
Run Code Online (Sandbox Code Playgroud)

use*_*881 6

我重新阅读了您的问题,并认为我理解正确。您想知道new_orders(您称之为data)中的任何订单是否已使用expired_orders(您称之为data2)过期。

如果您重新表述您的问题,您想要做的是:1)找出 a 中列中的值DataFrame是否在另一列中DataFrame,然后 2)删除两个.


使用pd.merge是一种方法。但既然你想用过expired_orders滤器new_orderspd.merge似乎有点矫枉过正。

Pandas 实际上有一种方法可以做这种事情,它被调用,isin()所以让我们使用它!此方法允许您检查一个中的值是否column存在于另一个中column

df_1['column_name'].isin(df_2['column_name'])
Run Code Online (Sandbox Code Playgroud)

isin()返回Series真/假值,你可以申请通过把其作为掩模来过滤数据帧:df[bool_mask]

那么你如何在你的情况下使用它?

is_expired = new_orders['order_column'].isin(expired_orders['order_column'])
results = new_orders[~is_expired].copy() # Use copy to avoid SettingWithCopyError.
Run Code Online (Sandbox Code Playgroud)

~等于 not - 所以~is_expired意味着订单没有过期。