【问题标题】:Pandas - binning within date groupby熊猫 - 日期分组内的分箱
【发布时间】:2019-01-10 22:29:46
【问题描述】:

我的目标是在我的数据集的几年内按大小汇总数据。我可以分别完成这两项任务(例如按年份汇总或按 bin 汇总),但在将两者结合起来时遇到语法问题。

以下是我如何按年份汇总数据:

size_summary = df_raw.groupby(['Year'])['Quantity'].describe()

下面是我如何创建我的垃圾箱

mult = 1
bins = [5*mult, 10*mult, 25*mult, 50*mult, 100*mult]
groups = df_raw.groupby(pd.cut(df_raw['Quantity'], bins))

当我尝试在下面将两者结合起来时,我收到一条错误消息。有谁知道如何结合它来达到我的目标?谢谢您的帮助。

groups.groupby(['Year'])['Quantity'].describe()
AttributeError: Cannot access callable attribute 'groupby' of 'DataFrameGroupBy' objects, try using the 'apply' method

编辑:根据要求添加示例数据,如下所示。

df_raw = pd.DataFrame(data={
    'Year': [2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014],
    'Quantity': [2.0, 3.0, 78.8, 65.7, 70.0, 61.9, 83.9, 39.7, 44.1, 14.5, 35.3, 82.2, 13.9, 66.6, 65.8, 94.8, 50.8, 17.1, 9.9, 51.1, 62.9, 63.0, 13.5, 37.6, 1.5, 70.7, 23.3, 28.1, 21.9, 60.7, 1.1, 67.2, 0.4, 81.4, 86.7, 36.2, 45.2, 50.4, 43.3]
})

所需的输出格式如下 - 为截图道歉。

【问题讨论】:

  • 请发布示例数据集和所需的输出。
  • 按要求,请参阅编辑。

标签: python pandas bin


【解决方案1】:

作为pivot_table 的替代方案,您可以按箱和年份分组,然后通过unstack 重塑您的数据:

# first group by bins, then by year
groups = df_raw.groupby([pd.cut(df_raw['Quantity'], bins), 'Year'])

# compute group size, pivot into the shape you want
counts = groups.size().unstack(fill_value=0)
counts
Year       2012  2013  2014
Quantity                   
(5, 10]       0     1     0
(10, 25]      2     3     1
(25, 50]      3     2     3
(50, 100]     7     7     5

在您提供的示例数据上,这比 pivot_table 快大约 2.5 倍。


要将分类区间索引拆分为MultiIndex,请使用类似

def interval_to_tuple(interval):
    return interval.left, interval.right

counts.set_index(
    counts.index.astype(object).map(interval_to_tuple).rename(['Lower', 'Upper']))
Year         2012  2013  2014
Lower Upper                  
5     10        0     1     0
10    25        2     3     1
25    50        3     2     3
50    100       7     7     5

您应该能够毫无问题地将此结果导出到 Excel。

【讨论】:

  • 你知道如何正确导出到excel吗?区间索引给它带来了麻烦
  • @Z_D,请查看编辑。这个想法是将分类区间索引拆分为列(或索引级别,正如我所做的那样)。它不漂亮,可能有更好的方法。
【解决方案2】:

你真的很亲密。请试试这个:

mult = 1
bins = [0, 5*mult, 10*mult, 25*mult, 50*mult, 100*mult]
df_raw['bin'] = pd.cut(df_raw['Quantity'], bins)
df_raw.pivot_table(index = 'bin', columns = 'Year', aggfunc = 'count')

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多