2013-10-10 4 views
1

(느린!) 루프에서 아래 코드가 수행하는 더 좋은 방법이 있습니까?Python - Pandas에서 Sparse 출력 형식

입력 된 DataFrame을 사용하여 각 사용자가 소비 한 제품 목록으로 변환하려고합니다. 하지만이 목록은 수백만에 달할 것이고 이것은 (내가 cython을 사용하지 않는다면) 매우 비효율적 인 것처럼 보입니다. 모든 아이디어를 더 python-happy하게 만드는 방법? 감사합니다.

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 

은 (내가 원하는 정확히입니다)이 출력을 제공합니다 : 당신은 groupby을 사용할 수

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

:

>>> 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' 속성을 확인하십시오. –

관련 문제