我正在尝试使用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
我不确定是否需要为此创建新的索引键值。
答案 0 :(得分:0)
我能够完成我最初的要求。 但确实需要对列名进行一些按摩。
解决方案(使用伪代码):
使用相关数据设置数据帧。 e.g。
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值创建新的数据框。
e.g。
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相对较新。