1

我正在尝试使用 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 万个唯一组合)

我一直在尝试使用合并、连接和连接功能,但无济于事。我觉得我错过了一些重要的东西,因为在 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

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

4

1 回答 1

0

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

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

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

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 个唯一索引值和 3 个条目。这不是很理想,但现在可以了,主要缺点是您不能再唯一地访问单个条目行,它们将以三倍的形式出现。要访问数据,您可以根据唯一的 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

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

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

于 2012-10-10T02:21:24.573 回答