2013-10-10 59 views
1

有沒有更好的方法來做下面的代碼在(slow!)循環中做的事情?Python - 從熊貓到稀疏輸出格式

使用輸入DataFrame,我想將其轉換爲每個用戶消耗的產品列表。但是這個列表將長達數百萬年,這似乎相當低效(除非我使用cython)。任何想法如何使這個更蟒蛇開心? 謝謝!

a = pd.DataFrame({'user_id':['a', 'a', 'b', 'c', 'c', 'c'], 'prod_id':['p1', 'p2', 'p1', 'p2', 'p3', 'p7']}) 

print "Input Dataframe:\n", a 
print '\nDesired Output:' 

# Build desired output: 
uniqIDs = a.user_id.unique() 

for id in uniqIDs: 

    prod_list = list(a[a.user_id == id].prod_id.values)   

    s = id + '\t' 
    for x in prod_list: 
     s += x + '\t' 

    print s # This will get saved to a TAB DELIMITED file 

給出了這樣的輸出(這正是我的願望):

Input Dataframe: 
    prod_id user_id 
0  p1  a 
1  p2  a 
2  p1  b 
3  p2  c 
4  p3  c 
5  p7  c 

Desired Output: 
a p1 p2 
b p1 
c p2 p3 p7 

回答

3

你可以使用groupby

>>> a = pd.DataFrame({'user_id':['a', 'a', 'b', 'c', 'c', 'c'], 'prod_id':['p1', 'p2', 'p1', 'p2', 'p3', 'p7']}) 
>>> a 
    prod_id user_id 
0  p1  a 
1  p2  a 
2  p1  b 
3  p2  c 
4  p3  c 
5  p7  c 
>>> a.groupby("user_id")["prod_id"].unique() 
user_id 
a    [p1, p2] 
b     [p1] 
c   [p2, p3, p7] 
dtype: object 

嗯。

以您想要的確切格式獲取輸出令人驚訝地很麻煩,因爲我看不到任何方法來覆蓋pandas'想逃避事物的慾望。 IOW,很容易.apply('\t'.join)到手動結果系列,但很難使用\t作爲分隔符保存它。

因此,這裏的另一種方法:

>>> df = pd.DataFrame({k: g.reset_index(drop=True) 
         for k,g in a.groupby("user_id")["prod_id"]}).T 
>>> df.to_csv("prod.csv", sep="\t", header=False) 
>>> !cat prod.csv 
a p1 p2 
b p1  
c p2 p3 p7 

如果你真正想要的,你可以剝離在年底額外的標籤。

+0

看起來不錯@DSM。有沒有一種有效的方法來刪除括號,並最終以製表符分隔的輸出結束? – zbinsd

+1

@zbinsd簽出'Series'對象的'str'屬性。 –