【问题标题】:Boolean Logic Comparing Data From Two Pandas Dataframes比较来自两个 Pandas 数据帧的数据的布尔逻辑
【发布时间】:2018-06-14 13:48:03
【问题描述】:

我有以下数据框df1:

          Date  Invoice          Name  Price  Coupon Location
0   2017-12-24   700349      John Doe  59.95    NONE    VAGG1
1   2017-12-24   700347     Joe Smith  59.95    GBMR       GG
2   2017-12-24   700345  Dave Johnson  35.00  CHANGE    VAGG1
3   2017-12-24   700342     Sue Davis  35.00  GADSLR    VAGG1
4   2017-12-23   700329   Betty Clark  84.95  GADSLR      GG2

第二个数据框df2:

           Date  Invoice         Name  Price    Coupon    Location
0   2017-12-24    800349     John Doe  59.95   NONE      VAGG1
1   2017-12-24    800347    Joe Smith  59.95   GBMR      GG
2   2017-12-24    800345     John Doe  17.95   CHANGE    VAGG1
3   2017-12-24    800342     John Doe   9.95   GADSLR    VAGG1
4   2017-12-23    800329  Sue Simpson  34.95   GADSLR    GG2

我想使用以下逻辑创建第三个数据框df3。

  • 对于df1 中的每个名称,检查是否有匹配项。
  • 如果有匹配,将匹配行从df2添加到df3,提供 该行的价格与关联的价格不匹配 如果df1,则为该名称。

所以输出数据框df3 应该如下所示:

+------------+---------+----------+-------+--------+----------+
|    Date    | Invoice |   Name   | Price | Coupon | Location |
+------------+---------+----------+-------+--------+----------+
| 2017-12-24 |  800345 | John Doe | 17.95 | CHANGE | VAGG1    |
| 2017-12-24 |  800342 | John Doe |  9.95 | GADSLR | VAGG1    |
+------------+---------+----------+-------+--------+----------+

【问题讨论】:

  • 匹配是否严格在Name 列上,而不是Invoice?
  • @ako 是的,你是对的。仅在Name 上,不在Invoice 上。
  • 所以您要问,“对于 df2 中名称在 df1 中的任何行,如果价格与 df1 中的价格不同,则返回该行?”如果是这样,您可以合并 df1 和 df2,然后删除 Price_y==Price_x 所在的行。
  • @ako,听起来不错。有没有机会发布那行代码作为答案?因为我还是不知道怎么写。

标签: python python-3.x pandas numpy scikit-learn


【解决方案1】:

使用merge + query -

df1.merge(df2[['Name', 'Price']], on='Name')\
   .query('Price_x != Price_y')\
   .drop('Price_x', 1)\
   .rename(columns={'Price_y' : 'Price'})

         Date  Invoice      Name Coupon Location  Price
1  2017-12-24   700349  John Doe   NONE    VAGG1  17.95
2  2017-12-24   700349  John Doe   NONE    VAGG1   9.95

df1 和 df2 是您各自的数据框。

【讨论】:

  • @COLDSPEED 当我尝试运行您的代码时,我收到以下错误:KeyError: "['Name' 'Price'] not in index".
  • 键周围实际上有一些额外的空格,我将其删除。一旦这些都消失了,我将 df3 = 设置为您的代码行。结果是一个空的数据框。
  • @HMLDude 需要更多信息。如果它适用于此示例,但不适用于您的实际数据,请确保您的 dtypes 匹配。
【解决方案2】:

以下代码块:

df3 = pd.merge(df1, df2, on='Name', how='right')\
        .query('Price_x != Price_y')\
        .drop('Price_x', 1)\
        .rename(columns={'Price_y' : 'Price'})

df3 = 中的结果

            Date_x  Invoice_x         Name Coupon_x Location_x        Date_y  \
1   2017-12-24   700349.0     John Doe     NONE      VAGG1   2017-12-24
2   2017-12-24   700349.0     John Doe     NONE      VAGG1   2017-12-24
4          NaN        NaN  Sue Simpson      NaN        NaN   2017-12-23

   Invoice_y  Price  Coupon_y  Location_y
1     800345  17.95   CHANGE    VAGG1
2     800342   9.95   GADSLR    VAGG1
4     800329  34.95   GADSLR    GG2

扩展代码块:

df3 = pd.merge(df1, df2, on='Name', how='right')\
        .query('Price_x != Price_y')\
        .drop('Price_x', 1)\
        .rename(columns={'Price_y' : 'Price'})\
        .drop('Location_x',1)\
        .drop('Coupon_x',1)\
        .drop('Date_x',1)\
        .drop('Invoice_x',1)\
        .rename(columns={'Date_y' : 'Date'})\
        .rename(columns={'Invoice_y' : 'Invoice'})\
        .rename(columns={'Coupon_y' : 'Coupon'})\
        .rename(columns={'Location_y' : 'Location'})

df3 = 中的结果

          Name          Date  Invoice  Price    Coupon    Location
1     John Doe   2017-12-24    800345  17.95   CHANGE    VAGG1
2     John Doe   2017-12-24    800342   9.95   GADSLR    VAGG1
4  Sue Simpson   2017-12-23    800329  34.95   GADSLR    GG2

这是有问题的,因为它会导致列行乱序。加上:

df3=df3[['Date', 'Invoice', 'Name', 'Price', 'Coupon', 'Location']]

我们得到df3 =

           Date  Invoice         Name  Price    Coupon    Location
1   2017-12-24    800345     John Doe  17.95   CHANGE    VAGG1
2   2017-12-24    800342     John Doe   9.95   GADSLR    VAGG1
4   2017-12-23    800329  Sue Simpson  34.95   GADSLR    GG2

这与期望的答案很接近,除了“Sue Simpson”条目,它应该不存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多