【问题标题】:group_by with Impala Ibisgroup_by 与 Impala Ibis
【发布时间】:2015-10-20 21:40:48
【问题描述】:

我有一个 Impala 表,我想使用 Ibis 进行查询。该表如下所示:

   id  | timestamp
-------------------
 A     | 5
 A     | 7
 A     | 3
 B     | 9
 B     | 5

我想根据idtimestamp range 的独特组合来group_by 这个表。分组操作最终应该生成一个 grouped 对象,然后我可以对其应用聚合。例如:

group1 条件:id == A; 4 < timestamp < 11
group2 条件:id == A; 1 < timestamp < 6
group3 条件:id == B; 4 < timestamp < 7

产生具有以下组的grouped 对象:

组1:

   id  | timestamp
-------------------
 A     | 5
 A     | 7

组2:

   id  | timestamp
-------------------
 A     | 5
 A     | 3

组3:

   id  | timestamp
-------------------
 B     | 5

拥有组后,我将执行各种聚合以获得最终结果。如果有人能帮我弄清楚这个 group_by 将不胜感激,即使是普通的 pandas 表达式也会有所帮助!

【问题讨论】:

    标签: python pandas group-by cloudera impala


    【解决方案1】:

    下面是groupby 的示例(无下划线):

    df = pd.DataFrame({"id":["a","b","a","b","c","c"], "timestamp":[1,2,3,4,5,6]})
    

    为您的timestamp 创建一个分组列。

    df["my interval"] = (df["timestamp"] > 3 )&  (df["timestamp"] <5)
    "you need some _data_ columns, i.e. those which you do not use for grouping"
    df["dummy"] = 1 
    df.groupby(["id", "my interval"]).agg("count")["dummy"]
    

    或者你可以同时使用:

    df["something that I need"] = df["my interval"] & (df["id"] == "b")
    df.groupby(["something that I need"]).agg("count")["dummy"]
    

    您可能还想应用整数除法来生成时间间隔:

    df = pd.DataFrame({"id":["a","b","a","b","c","c"], "timestamp":[1,2,13,14,25,26], "sales": [0,4,2,3,6,7]})
    epoch = 10
    df["my interval"] = epoch* (df["timestamp"] // epoch)
    df.groupby(["my interval"]).agg(sum)["sales"]
    

    编辑:

    你的例子:

    import pandas as pd
    A = "A"
    B = "B"
    df = pd.DataFrame({"id":[A,A,A,B,B], "timestamp":[5,7,3,9,5]})
    df["dummy"] = 1
    

    解决方案:

    grouper = (df["id"] == A) & (4 < df["timestamp"] ) & ( df["timestamp"] < 11)
    df.groupby( grouper ).agg(sum)["dummy"]
    

    或更好:

    df[grouper]["dummy"].sum()
    

    【讨论】:

    • 您好 Dima,感谢您的回答。我面临的挑战是创建多个有时重叠的时间段,这些时间段仅适用于特定的ids。如果您尝试从我的示例中生成组,您就会明白我的意思。作为旁注,pandas 有一个方便的便利功能,用于对分箱值进行分组,称为 pd.cut
    • 如果您有重叠的间隔,您将需要几个groupby 操作,或者更有效地您可以使用逻辑索引。查看上次编辑
    • 正如我所提到的,问题是使用单个groupby 生成所有组。再次尝试解决完整的示例,您将体会到挑战。
    • 考虑一下所罗门国王将婴儿按其母亲分组,您会意识到挑战确实是根本性的。如果要将有限集拆分为有限数量的子集,则不能将初始子集的一个元素包含在多个组中
    • Groupby 对标签进行操作,也就是说,您给每个元素一个标签,将其映射到一个子集。您可能没有将一个元素映射到多个子集的两个标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多