2016-09-21 1 views
1

나는 짹짹의 데이터 프레임을 가지고 있으며 날짜별로 데이터 프레임을 그룹화하고 해당 날짜까지 게시 한 모든 고유 사용자의 누적 목록이 포함 된 열을 생성하려고합니다. 기존 기능 (예 : cumsum)이이 용도로 작동하지 않는 것으로 보입니다. 내가 날짜를 기준으로 데이터 집합을 붕괴 하루 고유의 사용자와 열을 얻을 수PANDAS의 누적 집합

In [3]: df 
Out[3]: 
      screen_name 
created_at 
04-01-16 Bob 
04-01-16 Bob 
04-01-16 Sally 
04-01-16 Sally 
04-02-16 Bob 
04-02-16 Miguel 
04-02-16 Tim 

:

In [4]: df[['screen_name']].groupby(df.index.date).aggregate(lambda x: set(list(x))) 

Out[4]:    from_user_screen_name 
     2016-04-02 {Bob, Sally} 
     2016-04-03 {Bob, Miguel, Tim} 
다음 인덱스 (created_at가) 날짜 형식으로되어 원래의 트윗 dataframe의 샘플입니다

지금까지 너무 좋아.

Out[4]:    Cumulative_list_up_to_this_date Cumulative_number_of_unique_users 
     2016-04-02 {Bob, Sally}      2 
     2016-04-03 {Bob, Sally, Miguel, Tim}   4 

궁극적으로 제가 정말 관심 것은 그래서 그것을 그릴 수있는 마지막 열의 누적 숫자입니다 :하지만 제가 원하는 것은이 같은 "누적 세트"를하는 것입니다. 나는 날짜와 다른 것들에 대해 루핑을 고려했지만 좋은 방법을 찾을 수없는 것 같습니다. 모든 도움을 미리 감사드립니다.

답변

3

세트를 추가 할 수는 없지만 목록을 추가 할 수 있습니다! 따라서 사용자 목록을 작성한 다음 누적 합계를 취하고 마지막으로 세트 생성자를 적용하여 중복 제거하십시오.

cum_names = (df['screen_name'].groupby(df.index.date) 
           .agg(lambda x: list(x)) 
           .cumsum() 
           .apply(set)) 
# 2016-04-01     {Bob, Sally} 
# 2016-04-02 {Bob, Miguel, Tim, Sally} 
# dtype: object 

cum_count = cum_names.apply(len) 
# 2016-04-01 2 
# 2016-04-02 4 
# dtype: int64 
+0

정말 멋지다! 나는 * cumsum() 함수가 누적리스트를 생성한다는 것을 몰랐다. 정확히 내가 필요로하는 것. 감사! –

+0

이 응답은 더 이상 작동하지 않으므로 "ValueError : Function does not reduce"가 표시됩니다. .apply (list)를 사용하면 제대로 작동합니다. –

+0

@BrianKeegan 위의 접근 방식을 깬 판다의 버전에 대한 정보를 더 제공 할 수 있습니까? 우리는 그것을 반영하기 위해 내 대답을 업데이트 할 수 있습니다. –