【问题标题】:Union all type query with python pandas使用 python pandas 联合所有类型的查询
【发布时间】:2012-09-30 10:04:53
【问题描述】:

我正在尝试使用 pandas 对平面数据源进行数据分析。具体来说,我试图完成的是相当于 SQL 中的 Union All 查询。

我使用 read_csv() 方法输入数据,输出具有唯一的整数索引和大约 30+ 列。

在这些列中,有几列包含识别信息,而其他列包含数据。

总共,前 6 列包含唯一标识条目的标识信息。在这 6 列之后,有一系列列(A、B...等)引用了该值。其中一些列以集合的形式链接在一起,例如 (A,B,C) 和 (D,E,F) 一样。

但是,(D,E,F) 也与 (A,B,C) 相关,如下所示 ((A,D),(B,E),(C,F))。 我正在尝试做的是获取我的数据集,该数据集如下:

(id1,id2,id3,id4,id5,id6,A,B,C,D,E,F) 

并返回以下内容

((id1,id2,id3,id4,id5,id6,A,B,C),
 (id1,id2,id3,id4,id5,id6,D,E,F))

在这里,由于 A 和 D 是链接的,因此它们包含在同一列中。

(注意,这是一种简化,整个数据集中大约有 1200 万个唯一组合)

我一直在尝试使用 merge、concat 和 join 函数,但无济于事。我觉得我错过了一些重要的东西,因为在 SQL 数据库中我可以简单地执行一个联合所有查询(诚然这很慢)来解决这个问题。

现阶段我没有可用的示例代码。

根据一些 pandas 文档编写此问题的另一种方法。

left = key lval
right = key rval
merge(left, right, on=key) = key, lval, rval

我想要的是:

left = kev, lval
right = key, lval
union(left, right) = key, lval
                     key, rval

我不确定是否需要为此创建新的索引键值。

【问题讨论】:

    标签: python union pandas


    【解决方案1】:

    我已经能够完成我最初的要求。 但是,它确实需要对列名进行一些按摩。

    解决方案(使用伪代码):

    使用相关数据设置数据框。例如

    left = (id1,id2,id3,id4,id5,id6,A,B,C)
    right = (id1,id2,id3,id4,id5,id6,D,E,F)
    middle = (id1,id2,id3,id4,id5,id6,G,H,I)
    

    请注意,对于我的数据集,这导致我对每个 id 都有非唯一的索引键。也就是说,左右各行都有一个键。

    重命名列名。

    col_names = [id1,id2,id3,id4,id5,id6,val1,val2,val3]
    left.columns = col_names
    right.columns = col_names
    middle.columns = col_names
    

    连接这些

    pieces = [left, right, middle]
    new_df = concat(pieces)
    

    现在,这将创建一个包含 x 个唯一索引值和 3x 个条目的新数据框。这不是很理想,但现在可以了,主要缺点是您不能再唯一地访问单个条目行,它们将以三倍的形式出现。要访问数据,您可以根据唯一的 id 值创建一个新的数据框。

    例如

    check_df = new_df[(new_df[id1] == 'id1') & (new_df[id2] == 'id2') ... etc])
    print check_df
    
    key, id1, id2, id3, id4, id5, id6, A, B, C
    key, id1, id2, id3, id4, id5, id6, D, E, F
    key, id1, id2, id3, id4, id5, id6, G, H, I
    

    现在,这不是很理想,但它是我进行其他一些分析所需的格式。它可能并不适用于所有各方。

    如果有人有更好的解决方案,请分享,我对在 python 中使用 pandas 比较陌生。

    【讨论】:

    • 您可以为 concat 使用 keys 参数,这将产生一个 MultiIndex 并允许您唯一地选择数据: concat(pieces, keys=['left', 'middle', 'right' ]。我还将 (id1, ..., id6) 设置为索引,这将减少选择数据的冗长。
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2018-02-27
    • 2018-08-30
    • 2023-01-24
    • 1970-01-01
    • 2021-12-09
    • 2020-08-04
    相关资源
    最近更新 更多