Pandas - 合并/连接/vlookup df 并删除所有匹配行

3
我想引用一个过期订单列表,这个列表在一个名为"data2"的电子表格中,然后在新订单的电子表格(名为"data")上进行vlookup操作,以删除包含过期订单的所有行。然后返回一个新的电子表格(名为"results")。我尝试在pandas中模仿我在Excel中使用vlookup/sort/delete所做的操作,但遇到了问题。请查看伪代码/步骤如下:
  1. 作为名为"data"的数据帧导入simple.xls
  2. 将wo.xlsm中名为"T"的工作表作为名为"data2"的数据帧导入
  3. 使用“data”中的列"A"作为要匹配的值来进行vlookup,并与"data2"中的列"A"中的任何相同值匹配(它们都只是订单ID)
  4. 对于所有存在于"data2"的A列中并且也存在于"data"的A列中的值,对它们进行分组(如果有必要)并删除每个匹配到的订单ID所在行(共26列)。再次强调,在"data"文件中删除找到的匹配项的整行。将较小的数据集保存为"results"
    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()

哪个DataFrame包含您想要删除的值?是data还是data2?您需要保留lookup表中的columns,还是只想使用它来过滤您的订单? - user3471881
1个回答

6
我重新阅读了您的问题并认为我理解得很正确。您想要使用expired_orders(您称之为data2)来查找new_orders中(您称之为data)的任何订单是否过期。
如果您重述一下您的问题,您想要做的是:1)查找DataFrame中某一列的值是否在另一个DataFrame的列中,并且然后2)删除存在于两个数据框中的值所在的行。

使用pd.merge是实现这一点的一种方法。但是由于您想要使用已过期的订单来筛选新订单,因此pd.merge看起来有点过于复杂。

Pandas实际上有一种用于执行此类操作的方法,它被称为isin(),让我们使用它吧!此方法允许您检查一个column中的值是否存在于另一个column中。

df_1['column_name'].isin(df_2['column_name'])

isin() 返回一个由 True/False 值组成的 Series,你可以将它作为掩码应用于 DataFrame 进行过滤:使用 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.

~等于否定,所以~is_expired表示订单没有过期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接