【问题标题】:Pandas data frame: groupby and plot with two different columns熊猫数据框:groupby 和 plot 有两个不同的列
【发布时间】:2018-12-29 00:40:52
【问题描述】:

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

我有一个熊猫数据框df,其中包含许多列。其中两列是tour_idtour_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_distance 与每组 tour_id 中的行数的直方图。

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

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

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

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'

【问题讨论】:

  • 请检查您的拼写;-)

标签: python pandas group-by histogram


【解决方案1】:

你的代码中的问题是,一旦你 groupby tour_id,它就变成了索引。您必须指定as_index=False 或使用reset_index() 才能使用它。此外,您不需要找到一个系列然后将其合并回来。

你需要:

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

输出:

【讨论】:

    【解决方案2】:

    可以更容易实现:

    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
    

    【讨论】:

    • 你必须使用 groupby 两次。 :((
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2018-07-10
    • 2016-10-09
    • 2013-12-19
    • 2021-04-30
    相关资源
    最近更新 更多