如何根据来自另一个 DataFrame 的数据删除 DataFrame 的行?

Han*_*ana 4 python dataframe pandas

我是 Pandas 的新手,我正在尝试弄清楚这种情况:我有一个包含两个产品的示例 DataFrame。df =

  Product_Num     Date   Description  Price 
          10    1-1-18   Fruit Snacks  2.99
          10    1-2-18   Fruit Snacks  2.99
          10    1-5-18   Fruit Snacks  1.99
          10    1-8-18   Fruit Snacks  1.99
          10    1-10-18  Fruit Snacks  2.99
          45    1-1-18         Apples  2.99 
          45    1-3-18         Apples  2.99
          45    1-5-18         Apples  2.99
          45    1-9-18         Apples  1.49
          45    1-10-18        Apples  1.49
          45    1-13-18        Apples  1.49
          45    1-15-18        Apples  2.99 
Run Code Online (Sandbox Code Playgroud)

我还有另一个看起来像这样的小 DataFrame(显示相同产品的促销价格):df2=

  Product_Num   Price 
          10    1.99
          45    1.49 
Run Code Online (Sandbox Code Playgroud)

请注意,df2 不包含“日期”和“说明”列。我想要做的是使用 df1 中的数据从 df1 中删除所有促销价格(对于促销中的所有日期)。做这个的最好方式是什么?

所以,我想看看这个:

  Product_Num     Date   Description  Price 
          10    1-1-18   Fruit Snacks  2.99
          10    1-2-18   Fruit Snacks  2.99
          10    1-10-18  Fruit Snacks  2.99
          45    1-1-18         Apples  2.99 
          45    1-3-18         Apples  2.99
          45    1-5-18         Apples  2.99
          45    1-15-18        Apples  2.99 
Run Code Online (Sandbox Code Playgroud)

我正在考虑对列 Price 和 Product_Num 进行合并,然后看看我能从那里做些什么。但是我因为多个日期而感到困惑。

WeN*_*Ben 5

isin&

df.loc[~((df.Product_Num.isin(df2['Product_Num']))&(df.Price.isin(df2['Price']))),:]
Out[246]: 
    Product_Num     Date  Description  Price
0            10   1-1-18  FruitSnacks   2.99
1            10   1-2-18  FruitSnacks   2.99
4            10  1-10-18  FruitSnacks   2.99
5            45   1-1-18       Apples   2.99
6            45   1-3-18       Apples   2.99
7            45   1-5-18       Apples   2.99
11           45  1-15-18       Apples   2.99
Run Code Online (Sandbox Code Playgroud)

更新

df.loc[~df.index.isin(df.merge(df2.assign(a='key'),how='left').dropna().index)]
Out[260]: 
    Product_Num     Date  Description  Price
0            10   1-1-18  FruitSnacks   2.99
1            10   1-2-18  FruitSnacks   2.99
4            10  1-10-18  FruitSnacks   2.99
5            45   1-1-18       Apples   2.99
6            45   1-3-18       Apples   2.99
7            45   1-5-18       Apples   2.99
11           45  1-15-18       Apples   2.99
Run Code Online (Sandbox Code Playgroud)

  • 这不会也赶上 (product=10 and price=1.49) 吗? (2认同)