2017-10-20 69 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