这是我之前询问的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')
答案 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