如何从 Pandas MultiIndex 制作 Seaborn 折线图?

5

一个关于Seaborn / Pandas的新手问题:我有一个Facebook页面帖子数据的电子表格,看起来像这样(前20行):

| Name                   | ID              | Type      | Date             | Shares | Comments | Reactions | Engagement |
|------------------------|-----------------|-----------|------------------|--------|----------|-----------|------------|
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 09:00 | 61     | 39       | 610       | 710        |
| Guybrush's Page        | 167959249906191 | link      | 13/05/2020 09:04 | 4      | 27       | 481       | 512        |
| Elaine's Page          | 187202271820522 | album     | 13/05/2020 09:12 | 0      | 3        | 96        | 99         |
| Elaine's Page          | 187202271820522 | album     | 13/05/2020 09:14 | 1      | 14       | 426       | 441        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:20 | 3      | 8        | 158       | 169        |
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 09:20 | 26     | 101      | 508       | 635        |
| Elaine's Page          | 187202271820522 | undefined | 13/05/2020 09:23 | 1      | 11       | 109       | 121        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:28 | 2      | 257      | 987       | 1246       |
| Herman Toothrot's Page | 201295459914847 | photo     | 13/05/2020 09:30 | 1      | 0        | 178       | 179        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:31 | 3      | 6        | 162       | 171        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:38 | 44     | 143      | 4294      | 4481       |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:39 | 7      | 79       | 631       | 795        |
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 09:40 | 3      | 0        | 104       | 107        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:45 | 0      | 3        | 76        | 79         |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:45 | 20     | 78       | 1455      | 1553       |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:46 | 7      | 321      | 1847      | 2175       |
| Guybrush's Page        | 167959249906191 | link      | 13/05/2020 09:46 | 4      | 2        | 311       | 317        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:50 | 2      | 29       | 777       | 808        |
| Elaine's Page          | 187202271820522 | link      | 13/05/2020 09:53 | 0      | 0        | 115       | 115        |
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 10:00 | 143    | 255      | 10211     | 10609      |

实际数据集跨越多天。
我想制作一个 Seaborn 折线图,以时间为 X 轴(“日期”),然后按天计算帖子数量作为 Y 轴。
然后,我想将其中一个数字变量设置为 SIZE 参数,并通过 HUE 分离“名称”中的页面。
因此,最终结果将类似于此 Seaborn 教程示例。

enter image description here

我知道这需要进行重新采样(或某种分组?)按天创建每个页面的汇总数据存储桶,就像在此Excel透视表中所示:

enter image description here

我猜这也可能需要使用MultiIndex?
我以为我已经有所进展,
facebook_dataframe.groupby(["Name", "Date", "Reactions"], as_index=False)["Engagement"].sum()

...但我不想只按参与度(或任何一个变量)进行求和,并且我希望能够按天绘制图表。

我尝试过按天重新采样数据框,但最终得到的是显示计数或总和的系列,而我想要的是一些天的桶,其中所有数字变量都完好无损(如上述数据透视表所示)。

我希望这很清楚。我知道所提供的20个样本行都在同一天内,但如果任何建议解决方案可以改为按分钟重新采样,那么方法将是相同的吗?非常感谢任何帮助。

1个回答

4

如果我理解正确,您想使用pd.Grouper对数据进行groupby,以获取所需的频率和名称,然后使用agg函数按需要取得所有列和函数的结果:

data = (df.groupby([pd.Grouper(key='Date', freq='5T'), #replace 5T by D to get daily agggregation
                    'Name'])
          .agg(count=('Name','count'), 
               sum_shares=('Shares','sum'), 
               sum_comments=('Comments','sum'), 
               sum_engagement=('Engagement','sum'), )
          .reset_index()
       )

print (data.head())
                 Date                      Name  count  sum_shares  \
0 2020-05-13 09:00:00   Guybrush's Page              1           4   
1 2020-05-13 09:00:00   Herman Toothrot's Page       1          61   
2 2020-05-13 09:10:00   Elaine's Page                2           1   
3 2020-05-13 09:20:00   Elaine's Page                2           4   
4 2020-05-13 09:20:00   Herman Toothrot's Page       1          26   

   sum_comments  sum_engagement  
0            27             512  
1            39             710  
2            17             540  
3            19             290  
4           101             635  

那么你可以像这样使用seaborn:

import seaborn as sns
sns.lineplot(x='Date', y='count', data=data,
             hue='Name', 
             size='sum_shares') #here for the size use what summed column you want

我不发布图片,因为提供的20行数据实际上并没有什么可看的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接