簡體   English   中英

將Pandas的“findall”結果列表拆分為多個項目,按uniques分組

[英]Split a Pandas 'findall' result list into multiple items, to group by uniques

我已經下載了我的Twitter檔案,我正在嘗試對我最常談話的人做一些分析。

推文CSV列如下所示:

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

我使用read_csv()將tweets.csv文件導入名為“indata”的數據框中。

然后,為了獲得推文中提到的所有@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

我希望能夠做的是按個人句柄和日期分組,以顯示多年來與我交談過的人數。

有什么建議?

純粹的pandas方式可能是應用Series構造函數將它放入一個DataFrame並堆疊成一個Series(所以你可以使用value_counts)...如果你不關心索引/時間戳你可以使用集合( 可能更快):

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

使用集合'計數器這很容易:

In [21]: from collections import Counter

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

大熊貓的方式將保留索引(時間)信息。

Apply Series構造函數以獲取DataFrame並將其stack到Series中:

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

我們可以在這里整理名稱,以便對正在發生的事情進行更具描述性:

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()))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM