【问题标题】:Selecting multiple columns to plot with plotly python使用 plotly python 选择多列进行绘图
【发布时间】:2020-12-12 08:39:18
【问题描述】:

我有以下代码:

def campaign_plot(col1,col2):
    grouper = df.groupby(['Day','Campaign']).agg({col1: 'sum', col2: 'mean'}).unstack()
    result = grouper.fillna(0)
    
    fig = go.Figure()
    
    fig.add_trace(go.Scatter(
    x = result.index,
    y = result.iloc[:, [0, 4]],  #<---
    name = '1',
    line = dict(
        color = ('rgb(205, 12, 24)'),
        width = 2)
    ))

    fig.show()

我想使用数据框的第一列和第五列创建一个图。如果我只是做result.iloc[:, [0, 4]] 这将输出数据帧的正确列。但在图中它只输出两个点。我该如何解决这个问题?

编辑:这是分组的数据帧的 sn-p:

    Day          Campaign Clicks    CTR
0   2013-08-05   1        0         0
1   2013-08-05   3        1         0.5
2   2013-08-05   7        0         0.2
3   2013-08-05   15       5         3
4   2013-08-08   1        6         0.1
5   2013-08-08   3        1         0
6   2013-08-08   7        15        4.5
7   2013-08-08   15       0         1
8   2013-08-10   1        6         2.2
9   2013-08-10   3        20        0
10  2013-08-10   7        1         0.2
11  2013-08-10   15       1         0.1

所以在函数中,col1 是 Clicks,col2 是 CTR。点击次数求和,点击率求平均值。

然后将上述数据框按广告系列和日期分组,因此在图表中,x 轴是日期,每个广告系列都有一条单独的线。

【问题讨论】:

  • 张贴原始数据,df,因为您有索引数据,难以复制示例。
  • @SergedeGossondeVarennes 成功了

标签: python pandas dataframe pandas-groupby plotly-python


【解决方案1】:

另一种方法是融化您的数据框。这是一个如何执行此操作的示例。假设您有以下数据框:

          Date       High        Low       Open      Close     Volume  \
0   2019-01-02  19.000000  17.980000  18.010000  18.830000   87148700   
1   2019-01-03  18.680000  16.940001  18.420000  17.049999  117277600   
2   2019-01-04  19.070000  17.430000  17.549999  19.000000  111878600   
3   2019-01-07  20.680000  19.000000  19.440001  20.570000  107157000   
4   2019-01-08  21.200001  19.680000  21.190001  20.750000  121271000   
..         ...        ...        ...        ...        ...        ...   
458 2020-10-26  84.970001  80.860001  82.550003  82.230003   69423700   
459 2020-10-27  82.370003  77.570000  82.000000  78.879997  156669500   
460 2020-10-28  78.959999  75.760002  78.730003  76.400002   76529900   
461 2020-10-29  79.180000  76.290001  76.750000  78.019997   52784100   
462 2020-10-30  77.699997  74.230003  77.089996  75.290001   51349000   

并且您希望绘制列HighClose。然后,一个简单的方法是:

pd.options.plotting.backend = "plotly"
df.plot(x='Date', y=[ 'High', 'Close'])
df_melt = df.melt(id_vars='Date', value_vars=['High', 'Close'])
px.line(df_melt, x='Date' , y='value' , color='variable')

编辑:根据实际数据调整解决方案

您面临的问题是,您在分组后拥有多级索引,这使得在这种情况下难以使用。一种解决方法是删除它们。我不是专家,但我这样做(通常)。首先,我想以跟踪列的方式删除索引(名称需要对应于 Clicks 和 CTR AND Campaign)。因此,我需要将 Campaign 编号设为字符串,然后执行您所做的 groupby

df['Campaign'] = df['Campaign'].astype(str)
grouper = df.groupby(['Day','Campaign']).agg({'Clicks': 'sum', 'CTR': 'mean'}).unstack()

现在,重新索引的棘手部分来了(丑陋但有效)

a = grouper.columns
ind = pd.Index([e[0] + e[1] for e in a.tolist()])
grouper.columns = ind
result = grouper.reset_index()

给出:

         Day  Clicks1  Clicks15  Clicks3  Clicks7  CTR1  CTR15  CTR3  CTR7
0  2013-08-05        0         5        1        0   0.0    3.0   0.5   0.2
1  2013-08-08        6         0        1       15   0.1    1.0   0.0   4.5
2  2013-08-10        6         1       20        1   2.2    0.1   0.0   0.2

最后一步是绘图。

pd.options.plotting.backend = "plotly"
result.plot(x='Day', y=[ 'Clicks1', 'CTR1'])
result_melt = result.melt(id_vars='Day', value_vars= ['Clicks1', 'CTR1'])
px.line(result_melt, x='Day' , y='value' , color='variable')

在您的函数中,您必须将 ['Clicks1', 'CTR1'] 替换为 ['col1', 'col2']

返回以下情节:

【讨论】:

  • 这就是我想要达到的结果,但我该如何适应分组数据呢?在数据框中,我想先按一列分组,然后为分组数据绘制每组的两条线。那有意义吗?这可能吗?
  • 您的分组数据是一个数据框,例如示例中的我的 df。确定结果数据框中列的名称,然后像我一样做。或者,通过发布 10 行结果 df 来编辑您的问题,我将根据您的数据调整我的代码。
  • 我已经添加了数据框,因为 groupby 总是让我感到困惑
猜你喜欢
  • 2021-10-24
  • 2021-05-15
  • 2021-03-19
  • 2012-02-13
  • 2015-11-04
  • 2021-06-27
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多