提问者:小点点

熊猫数据框:groupby和plot具有两个不同的列


我是Python的超级初学者。长话短说,我想使用一列进行分组,将一个函数应用于一列,将另一个函数应用于另一列,并绘制结果(第一列到x轴,第二列到y轴)。

我有一个熊猫数据框df,它包含许多列。其中两列是tour\u idtour\u distance

tour_id    tour_distance    
      A               10
      A               10
      A               10
      A               10
      B               20
      B               20
      C               40
      C               40
      C               40
      C               40
      C               40
      :                :
      :                :

因为我假设tour_distance越长,每个tour_id的行就越多,所以我想在每组tour_id中绘制一个tour_distance与行计数的直方图。

问题1:这个groupby和plot问题的最简单解决方案是什么?

问题二:如何改进我失败的尝试?

我的尝试:我认为制作这样的新数据帧会更容易。

tour_id    tour_distance  row_counts
      A               10           3
      B               20           2
      C               40           5
      :                :           :

这样我就可以使用matplotlib这样做,

import matplotlib.pyplot as plt
x = df.tour_distance
y = df.row_counts
plt.bar(x,y)

但是,我无法创建此数据帧。

df_tour_distance = df.groupby('tour_id').tour_distance.head(1)
df_tour_distance = pd.DataFrame(df_tour_distance)
df_size = df.groupby('tour_id').tour_distance.size()
df_size = pd.DataFrame(df_size)
df = pd.merge(df_size, df_tour_distance, on='tour_id')

>>> KeyError: 'tour_id'

这也失败了:

g = df.groupby('tour_id')
result = g.agg({'Count':lambda x:x.size(), 
            'tour_distance_grouped':lambda x:x.head(1)})
result

>>> KeyError: 'Count'

共2个答案

匿名用户

代码中的问题是,一旦您按groupbytour\u id,它就会变成索引。必须将指定为\u index=False或使用reset\u index()才能使用它。此外,您不需要先查找序列,然后再将其合并回来。

你需要:

g = df.groupby(['tour_id', 'tour_distance']).size().reset_index(name='count')
plt.bar(g['tour_id'],g['count'])

输出:

匿名用户

可以更容易地实现:

import pandas as pd

tour_id = ['A']*4+['B']*2+['C']*5
tour_distance = [10]*4+[20]*2+[40]*5

df = pd.DataFrame({'tour_id': tour_id, 'tour_distance': tour_distance})
df = df.set_index('tour_id')

df2 = pd.DataFrame()
df2['tour_distance'] = df.groupby('tour_id')['tour_distance'].head(1)
df2['row_counts'] = df.groupby('tour_id').count()
print(df2)

结果:

         tour_distance  row_counts
tour_id                           
A                   10           4
B                   20           2
C                   40           5