【问题标题】:Pandas - merge/join/vlookup df and delete all rows that get a matchPandas - 合并/加入/vlookup df 并删除所有匹配的行
【发布时间】:2018-09-14 02:34:27
【问题描述】:

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

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

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

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


    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-table 中的columns,还是只想使用它来过滤您的订单?

标签: python pandas join


【解决方案1】:

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

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


使用pd.merge 是一种方法。但是既然要使用expired_orders来过滤new_orderspd.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.

~ 等于 not - 所以~is_expired 表示订单没有过期。

【讨论】:

    猜你喜欢
    • 2019-11-04
    • 2021-12-22
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2022-01-17
    • 2021-07-04
    • 2021-06-23
    相关资源
    最近更新 更多