Pandas数据帧列的总和与其他数据的梳理

时间:2015-11-18 15:13:58

标签: python pandas twitter

这是我之前询问的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用户的推文频率,并将其与我已有的数据相结合。所以我得到这样的东西:

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

我的数据集中每个Twitter用户都有1行的数据框,显示他们的推文计数以及最后一个screen_name和followers_count。

我认为我应该做的是先做'计算'操作,然后pd.merge该结果与我的原始数据框的一部分。尝试使用pandas文档的帮助合并并没有让我走得太远,大多数情况下无休止地重复重复数据行..任何帮助将不胜感激!

我做的计数部分如下:

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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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