【问题标题】:lookup within filtered range在过滤范围内查找
【发布时间】:2021-09-08 23:19:29
【问题描述】:

我有一个包含电子商务面板数据的数据框。 它有订单和退货混合在一起。 每行都有 orderID - 对于正常订单和客户返回的相应退货,它是相同的编号。

我的数据如下所示:

orderID Shop Revenue Note
44 0 -32 Return
45 0 -100 Return
44 1 14
45 3 20 Something else
46 2 50
47 1 80 Something
48 2 222

对于每个退货,我想找到与原始订单对应的“商店”列值。 例如:'orderID' == 44 出现两次:一次作为退货('Shop' == 0)和一次作为正常订单('Shop' == 1)。 我想将所有 0 值替换为 'Shop' 列与早期订单中的值

我想要的输出如下所示:

orderID Shop Revenue Note
44 1 -32 Return
45 3 -100 Return
44 1 14
45 3 20 Something else
46 2 50
47 1 80 Something
48 2 222

我知道如何在 Google 表格中执行此操作(首先我过滤表删除 'Shop'==0 值,然后我在这个过滤后的数组中查找数字)

我知道如何使用 Pandas 过滤此表,但我不知道如何编写。

我假设我需要先编写一个临时列,在其中存储两种类型的值 - 用于普通订单(刚刚复制)和用于退货。

原始数据框为 1 000 000+ 行

我的 .csv 数据可在此处获得: https://docs.google.com/spreadsheets/d/e/2PACX-1vQAJ4tMc_Bcvv-4FsUy3E7sG0m9hm-nLTVLj-LwlSEns-YJ1pbq6gSKp5mj5lZqRI2EgHOsOutwnn1I/pub?gid=0&single=true&output=csv

感谢您的建议!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,使用地图:

    m = df.query('Shop != 0').set_index('orderID')['Shop']
    df['Shop'] = df['orderID'].map(m)
    print(df)
    

    输出:

       orderID  Shop  Revenue            Note
    0       44     1      -32          Return
    1       45     3     -100          Return
    2       44     1       14             NaN
    3       45     3       20  Something else
    4       46     2       50             NaN
    5       47     1       80       Something
    6       48     2      222             NaN
    

    使用 query 创建一个 pd.Series 以过滤掉零商店,然后将 set_indexmap 商店用于 orderID。

    如果存在 1-1 商店到订单映射,则此方法有效。如果您的每个订单有多个商店,那么您将需要逻辑来确定哪个商店有效。

    如果你有重复的订单到同一家商店,那么你需要先drop_duplicates。

    【讨论】:

    • 谢谢!事实上,我不得不删除重复项,因为这个数据框包含每个订单中每个项目的行。现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2017-10-17
    • 2016-09-22
    • 2016-10-08
    • 2021-04-20
    相关资源
    最近更新 更多