Python 熊猫堆积条形图

Python 熊猫堆积条形图,python,pandas,plot,bar-chart,Python,Pandas,Plot,Bar Chart,我有以下数据集: SessionId Query 1 a 1 b 2 a 3 b 3 b 3 c 3 a 我想显示一个堆叠的条形图,其中每个会话都有一个条形图,该条形图将由每个查询的不同颜色组成,堆叠的大小将是每个会话中查询数量的大小 我试过这样的方法: result = data.groupby('S

我有以下数据集:

SessionId    Query
   1           a   
   1           b
   2           a
   3           b
   3           b
   3           c
   3           a
我想显示一个堆叠的条形图,其中每个会话都有一个条形图,该条形图将由每个查询的不同颜色组成,堆叠的大小将是每个会话中查询数量的大小

我试过这样的方法:

result = data.groupby('SessionId').apply(
   lambda group: (
      group.groupby('Query').apply(
         lambda queryGroup: (
            queryGroup.count()
         )                
      )
   )
 ) 

但是它在一个表中给出了一个奇怪的表

,因为堆积条形图依赖于绘制不同的列,所以您需要将数据表旋转,以获得包含行中查询数的列形式的查询

试试这个:

df = pd.DataFrame({"session":[1,1,2,2,3,3],
              "query":list("ababab"), "count":[5,7,32,5,8,1]})
df.pivot("session","query").plot(kind="bar", stacked=True)
输出:


堆积条形图依赖于绘制不同的列,因此您需要将数据表旋转,以将查询作为包含行中查询数的列

试试这个:

df = pd.DataFrame({"session":[1,1,2,2,3,3],
              "query":list("ababab"), "count":[5,7,32,5,8,1]})
df.pivot("session","query").plot(kind="bar", stacked=True)
输出:

如果我正确理解了你的问题,我应该做这项工作:

import pandas as pd

data = pd.DataFrame({'SessionId': [1, 1, 2, 3, 3, 3, 3], 
                     'Query': ['a', 'b', 'a', 'b', 'b', 'c', 'a']})

pd.crosstab(data.SessionId, data.Query).plot.barh(stacked=True)
如果我正确理解了你的问题,我应该做这项工作:

import pandas as pd

data = pd.DataFrame({'SessionId': [1, 1, 2, 3, 3, 3, 3], 
                     'Query': ['a', 'b', 'a', 'b', 'b', 'c', 'a']})

pd.crosstab(data.SessionId, data.Query).plot.barh(stacked=True)

您应该按两列进行分组,并使用
.size()
聚合(如果我没有记错的话)。然后你就可以得到条形图所需的数据了。@Shovalt:这看起来有点像
data.groupby(['SessionId',Query']).size().unstack().plot.barh(stacked=True)
,我猜。@stephan:正是我的意思,我在移动,无法测试:)你应该按两列分组,并使用
.size()
聚合(如果我没记错的话)。然后你就可以得到条形图所需的数据了。@Shovalt:这看起来像是
数据。groupby(['SessionId',Query']).size().unstack().plot.barh(stacked=True)
,我猜。@stephan:正是我的意思,我当时在手机上,无法测试:)惊人的一行@李:是的,
crosstab
有时非常有用。它基本上是一个包装。因此,您可以使用
pd.pivot\u表(data,None,'SessionId',Query',len.plot.barh(stacked=True)
获得相同的结果,这可能会更高效一些(但看起来不太好看)。令人惊讶的一行代码@李:是的,
crosstab
有时非常有用。它基本上是一个包装。因此,您可以使用
pd.pivot\u表(data,None,'SessionId',Query',len).plot.barh(stacked=True)
获得相同的结果,这可能会更高效一些(但看起来不太好看)。