2017-10-20 39 views
1

输入数据具有以下格式从行数据创建列表

id offset code 
1  3 21 
1  3 24 
1  5 21 
2  1 84 
3  5 57 
3  5 21 
3  5 92 
3  10 83 
3  10 21 

我想输出按以下格式

id offset     code 
1 [3,5]   [[21,24],[21]] 
2  [1]     [[84]] 
3 [5,10] [[21,57,92],[21,83]] 

,我已经能够代码想出如下所示

import random, pandas 
random.seed(10000) 

param = dict(nrow=100, nid=10, noffset=8, ncode=100) 
#param = dict(nrow=1000, nid=10, noffset=8, ncode=100) 
#param = dict(nrow=100000, nid=1000, noffset=50, ncode=5000) 
#param = dict(nrow=10000000, nid=10000, noffset=100, ncode=5000) 

pd = pandas.DataFrame({ 
    "id":random.choices(range(1,param["nid"]+1), k=param["nrow"]), 
    "offset":random.choices(range(param["noffset"]), k=param["nrow"]) 
}) 
pd["code"] = random.choices(range(param["ncode"]), k=param["nrow"]) 
pd = pd.sort_values(["id","offset","code"]).reset_index(drop=True) 

tmp1 = pd.groupby(by=["id"])["offset"].apply(lambda x:list(set(x))).reset_index() 
tmp2 = pd.groupby(by=["id","offset"])["code"].apply(lambda x:list(x)).reset_index().groupby(\ 
    by=["id"], sort=True)["code"].apply(lambda x:list(x)).reset_index() 

out = pandas.merge(tmp1, tmp2, on="id", sort=False) 

它确实给我,我想,但速度很慢,当数据框大的输出。我拥有的数据帧已超过4000万行。在这个例子中 取消对第四PARAM语句,你会看到它是多么慢。

可以请你做这个运行速度更快帮助吗?

+0

40个行,这可能不是一个合适的数据结构,什么是需要嵌套列表中的用例?输出的任何进一步聚合将会更慢。 – Zero

回答

5
(df.groupby(['id','offset']).code.apply(list).reset_index() 
    .groupby('id').agg(lambda x: x.tolist())) 
Out[733]: 
    offset      code 
id         
1 [3, 5]   [[21, 24], [21]] 
2  [1]     [[84]] 
3 [5, 10] [[57, 21, 92], [83, 21]] 
+0

谢谢〜@零,我总是在longggg线使得代码... – Wen