【问题标题】:Pandas pivot table: Aggregate function by count of a particular stringPandas 数据透视表:按特定字符串的计数聚合函数
【发布时间】:2020-08-17 19:20:42
【问题描述】:

我正在尝试分析一个 DataFrame,其中包含 Date 作为索引,Name 和 Message 作为列。

df.head() 返回:

            Name           Message
Date        
2020-01-01  Tom ‎           image omitted
2020-01-01  Michael        ‎image omitted
2020-01-02  James          ‎image Happy new year you wonderfully awfully people...
2020-01-02  James          I was waiting for you ‎image
2020-01-02  James          QB whisperer ‎image

这是我试图取消初始 df 的数据透视表,其中 aggfunc 是单词存在的计数(例如图像)

df_s = df.pivot_table(values='Message',index='Date',columns='Name',aggfunc=(lambda x: x.value_counts()['image']))

理想情况下,作为示例

 Name        Tom    Michael   James
 Date                                   
 2020-01-01    1       1        0
 2020-01-02    0       0        3

例如,我使用了另一个 df.pivot_table

df_m = df.pivot_table(values='Message',index='Date',columns='Name',aggfunc=lambda x: len(x.unique()))

根据一天中的消息数量进行聚合,然后返回表格。

提前致谢

【问题讨论】:

    标签: python pandas lambda pivot-table aggregate-functions


    【解决方案1】:

    使用Series.str.count 获取由DataFrame.assign 添加到DataFrame 的新列的匹配值数量,然后使用sum 进行旋转:

    df_m = (df.reset_index()
              .assign(count= df['Message'].str.count('image'))
              .pivot_table(index='Date', 
                           columns='Name', 
                           values='count' ,
                           aggfunc='sum', 
                           fill_value=0))
    print (df_m)
    Name        James  Michael  Tom
    Date                           
    2020-01-01      0        1    1
    2020-01-02      3        0    0
    

    【讨论】:

    • 如果您不介意,原始 df 中的 2020-01-02 在哪里?似乎找不到它
    • @sammywemmy - 你是对的,所以编辑了有问题的样本以供匹配。
    【解决方案2】:

    这是为了好玩,也是相同答案的替代方案。这只是对 Pandas 提供的不同选项的一种尝试:

          #or df1.groupby(['Date','Name']) if the index has a name
    res = (df1.groupby([df1.index,df1.Name])
              .Message.agg(','.join)
              .str.count('image')
              .unstack(fill_value=0)
          )
    
    res
    
    Name      James   Michael   Tom ‎
    Date            
    2020-01-01  0       1        1
    2020-01-02  3      0         0
    

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 1970-01-01
      • 2019-06-12
      • 2020-05-02
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多