2013-08-01 2 views
3

내 Twitter 자료실을 다운로드했으며 가장 많이 이야기 한 사람에 대한 분석을 시도하고 있습니다.팬더의 'findall'결과 목록을 여러 항목으로 나눠서 유니크로 그룹화합니다.

트윗 CSV 열은 다음과 같이 :

tweet_id,in_reply_to_status_id,in_reply_to_user_id,retweeted_status_id,retweeted_status_user_id,timestamp,source 

내가 사용했습니다 read_csv는() "inData의"라는 dataframe에 tweets.csv 파일을 가져올 수 있습니다.

그런 다음, 트윗에 언급 된 모든 @handles의 목록을 얻으려면, 나는 다음을 사용 :

handles = indata['text'].str.findall('@[a-zA-Z0-9_-]*') 

결과 : 내가 할 수 있도록하고 싶습니다 무엇

timestamp 
... 
2013-04-12 11:24:27        [@danbarker] 
2013-04-12 11:22:32         [@SeekTom] 
2013-04-12 10:50:45 [@33Digital, @HotwirePR, @kobygeddes, @] 
2013-04-12 08:00:03        [@mccandelish] 
2013-04-12 07:59:01        [@Mumbrella] 
... 
Name: text, dtype: object 

나는 개인의 손잡이와 날짜별로 그룹으로, 내가 지난 몇 년 동안 가장 많이 말한 사람의 수를 보여줍니다.

제안 사항?

답변

2

순전히 팬더 방식은이 값을 하나의 DataFrame에 넣고 Series에 쌓기 위해 (Value_counts를 사용할 수 있도록) Series 생성자를 적용하는 것일 수 있습니다 ... 사용할 수있는 인덱스/타임 스탬프에 신경 쓰지 않으면 컬렉션 ( 빨리 될 수 있음) :

In [11]: df = pd.DataFrame([['@a @b'], ['@a'], ['@c']], columns=['tweets']) 

In [12]: df 
Out[12]: 
    tweets 
0 @a @b 
1  @a 
2  @c 

In [13]: at_mentions = df['tweets'].str.findall('@[a-zA-Z0-9_]+') 

참고 : 나는 그 자체로 @ 포함해야한다고 생각하지 않기 때문에 내가 여기 + 오히려 *보다를 사용하십시오.

In [14]: at_mentions 
Out[14]: 
0 [@a, @b] 
1  [@a] 
2  [@c] 
Name: tweets, dtype: object 

collections' Counter 사용이 매우 간단합니다 : 인덱스 (시간) 정보를 보관합니다

In [21]: from collections import Counter 

In [22]: Counter(at_mentions.sum()) 
Out[22]: Counter({'@a': 2, '@b': 1, '@c': 1}) 

팬더 방법. 무슨 일이 일어나고 있는지

In [31]: all_mentions = at_mentions.apply(pd.Series) 

In [32]: all_mentions 
Out[33]: 
    0 1 
0 @a @b 
1 @a NaN 
2 @c NaN 

우리에 대한 자세한 설명으로 여기에 이름을 정돈 할 수 있습니다 :

Apply 시리즈 생성자는 시리즈로 DataFrame 및 stack를 얻을 수

In [33]: all_mentions.columns.name = 'at_number' 

In [34]: all_mentions.index.name = 'tweet' # this is timestamp in your example 

을 지금 때 스택의 이름을 보면 다음과 같습니다.

In [35]: all_mentions = all_mentions.stack() 

In [36]: all_mentions 
Out[36]: 
tweet at_number 
1  0   @a 
     1   @b 
2  0   @a 
3  0   @c 
dtype: object 

우리는 예를 value_counts를 들어, 여기에 다른 분석을 많이 할 수있는 :

In [37]: all_mentions.value_counts() 
Out[37]: 
@a 2 
@c 1 
@b 1 
dtype: int64 

최종 결과는 pd.Series(Counter(at_mentions.sum()))에 해당합니다.

+0

정말 포괄적 인 답변, Andy에게 감사드립니다. 팬더 네이티브 방식은 저에게 효과적입니다. 타임 스탬프를 유지하여 날짜별로 그룹화 할 수있는 아이디어가 마음에 듭니다.하지만 저를 컬렉션에 소개해 주셔서 감사합니다. –

관련 문제