【问题标题】:Pandas data frame sum of column and combing with other data熊猫数据框总和并与其他数据结合
【发布时间】:2015-11-19 00:42:14
【问题描述】:

这是我之前问过的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 和 follower_count。

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

count部分我做的如下:

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

【问题讨论】:

  • 如果您希望最终数据中的每个 'user.id' 唯一值都有一行,如果用户有多行,您希望保留哪一行?
  • 每一行都是一条推文,随着时间的推移收集起来。因此,对于这些指标,我想要列表中的最新条目。

标签: python pandas twitter


【解决方案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

【讨论】:

    【解决方案2】:

    您在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
    

    【讨论】:

      【解决方案3】:

      这是我自己做的,但我也会研究其他答案,它们可能有所不同是有原因的:)。

      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
      

      【讨论】:

      • 在更大的数据集上使用%%timeit 查看结果会很有趣。
      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      相关资源
      最近更新 更多