2015-11-18 190 views
1

這是我之前詢問並在當時得到合適答案的question的延續。然而,現在我的問題是不同的,給出的答案不再(完全)適用。大熊貓數據幀總和列與其他數據結合

我有一個Twitter消息的大集合,我想對它做一些統計分析。該數據幀的一部分看起來如下:

user.id  user.screen_name  user.followers_count  text 
Jim   JimTHEbest   14      blahbla 
Jim   JIMisCOOL    15      blebla 
Sarah  Sarah123    33      blaat 
Sarah  Sarah123    33      bla 
Peter  PeterOnline   9       blabla 

user.id永遠不會改變,並且是Twitter賬戶的標識符。

user.screen_name給予Twitter帳戶的名稱可隨時間而改變。

user.followers_count有多少追隨者帳戶,可隨時間變化。

text twitter消息,每一行代表1個twitter消息及其元數據。

我想要做的是計算每個Twitter用戶在我的數據框中的推文頻率,並將其與我已有的數據結合使用。所以,我得到這樣的:

user.id  user.screen_name  user.followers_count  count 
Jim   JIMisCOOL    15      2 
Sarah  Sarah123    33      2 
Peter  PeterOnline   9       1 

1排在我的數據集的每個用戶的Twitter,顯示他們的鳴叫次數和最後SCREEN_NAME和FOLLOWERS_COUNT的數據幀。

我認爲我應該做的是首先做'count'操作,然後用原始數據框的一部分pd.merge結果。嘗試合併熊貓文檔的幫助並沒有讓我走得很遠,大多數是無休止地重複重複數據的行。任何幫助將不勝感激!

計數我爲之如下:

df[['name', 'text']].groupby(['name']).size().reset_index(name='count') 
+0

如果您希望最終數據中的每個'user.id'唯一值有一行,並且您希望在用戶有多行時保留哪一行? – Joseph

+0

每行都是一個Tweet,隨着時間的推移收集。所以對於這些指標我想要列表中的最新條目。 – Lam

回答

0

這是我做到了我自己,但我也要去看看其他的答案,他們很可能是有原因的:)不同。

df2 = df[['user.id', 'text']].groupby(['user.id']).size().reset_index(name='count') 
df = df.set_index('user.id') 
df2 = df2.set_index('user.id') 
frames = [df2, df] 
result = pd.concat(frames, axis=1, join_axes=[df.index]) 
result = result.reset_index() 
result = result.drop_duplicates(['user.id'], keep='last') 
result = result[['user.id', 'user.screen_name', 'user.followers_count', 'count']] 
result 

    user.id user.screen_name user.followers_count count 
1 Jim  JIMisCOOL   15      2 
3 Sarah Sarah123   33      2 
4 Peter PeterOnline   9      1 
+0

在較大的數據集上使用'%% timeit'查看結果會很有趣。 – Alexander

1
# df being the original dataframe, taking the last row of each unique user.id and ignoring the 'text' column 
output_df = df.drop_duplicates(subset='user.id', take_last=True)[['user.id', 'user.screen_name', 'user.followers_count']] 
# adding the 'count' column 
output_df['count'] = df['user.id'].apply(lambda x: len(df[df['user.id'] == x])) 
output_df.reset_index(inplace=True, drop=True) 
print output_df 
>> user.id user.screen_name user.followers_count count 
    0  Jim  JIMisCOOL     15  2 
    1 Sarah   Sarah123     33  2 
    2 Peter  PeterOnline      9  1 
1

您小組user.id,然後用agg到自定義聚合功能應用到每一列。在這種情況下,我們使用lambda表達式,然後使用iloc來獲取每個組的最後一個成員。然後我們在文本列上使用count

result = df.groupby('user.id').agg({'user.screen_name': lambda group: group.iloc[-1], 
            'user.followers_count': lambda group: group.iloc[-1], 
            'text': 'count'}) 
result.rename(columns={'text': 'count'}, inplace=True) 

>>> result[['user.screen_name', 'user.followers_count', 'count']] 
     user.screen_name user.followers_count count 
user.id            
Jim   JIMisCOOL     15  2 
Peter  PeterOnline      9  1 
Sarah   Sarah123     33  2