如何使用 pandas.Grouper 对整数进行区间分组?

How to use pandas.Grouper to group integers in intervals?

难道pandas.Grouper只被认为是用来约会的吗?或者它也可以用于整数吗?

我想结合使用 pandas.Grouperpandas.pivot_table。 这是一个关于如何对包含 dates:

的列使用 pandas.Grouper 的示例
import pandas
import numpy
from datetime import datetime

date_data_frame = pandas.DataFrame(
            {                
                "date": [
                    datetime(2019, 9, 1, 13, 0),
                    datetime(2019, 9, 1, 13, 5),
                    datetime(2019, 10, 1, 20, 0),
                    datetime(2019, 10, 3, 10, 0),
                    datetime(2019, 12, 2, 12, 0),
                    datetime(2019, 9, 2, 14, 0),
                ],
                "name": "Maria Maria Maria Maria Jane Carlos".split(),
                "value": [25, 9, 4, 3, 2, 8],
            }
        )

grouped_pivot_table = pandas.pivot_table(
    date_data_frame,
    index=[pandas.Grouper(key="date", freq="M")], #grouped entries to show as row headers
    columns='name',               #entries to show as column headers
    values='value',               #entries to aggregate and show as cells
    aggfunc=numpy.sum,            #aggregation function(s)
)

print(grouped_pivot_table)

现在假设我没有日期,但有 1 到 100 之间的整数,我想将它们以 10 为间隔进行分组(1-10、11-20、 ...)。 如何使用 pandas.Grouper?

指定分组的间隔

我试过 freq="10" 但没有成功:

import pandas
import numpy
from datetime import datetime
    
date_data_frame = pandas.DataFrame(
            {                
                "param": [
                    1,
                    5,
                    10,
                    15,
                    22,
                    33,
                ],
                "name": "Maria Maria Maria Maria Jane Carlos".split(),
                "value": [25, 9, 4, 3, 2, 8],
            }
)
    
grouped_pivot_table = pandas.pivot_table(
    date_data_frame,
    index=[pandas.Grouper(key="param", freq="10")], #grouped entries to show as row headers
    columns='name',               #entries to show as column headers
    values='value',               #entries to aggregate and show as cells
    aggfunc=numpy.sum,            #aggregation function(s)
)
    
print(grouped_pivot_table)

如果 pandas.Grouper 无法做到这一点,我应该使用什么来对我的数据透视表 table 的参数索引进行分组?

可能的想法是使用整数除法,我认为 Grouper 仅适用于日期时间:

grouped_pivot_table = pandas.pivot_table(
    date_data_frame,
    index= (date_data_frame["param"] - 1) // 10, #grouped entries to show as row headers
    columns='name',               #entries to show as column headers
    values='value',               #entries to aggregate and show as cells
    aggfunc=numpy.sum,            #aggregation function(s)
)
    
print(grouped_pivot_table)
name   Carlos  Jane  Maria
param                     
0         NaN   NaN   34.0
1         NaN   NaN    7.0
2         NaN   2.0    NaN
3         8.0   NaN    NaN

或使用 cut 并从右侧关闭间隔:

bins = range(0, date_data_frame["param"].max() // 10 * 10 + 20, 10)
labels = ['{}-{}'.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])]

grouped_pivot_table = pandas.pivot_table(
    date_data_frame,
    #grouped entries to show as row headers
    index= pd.cut(date_data_frame["param"], bins=bins, labels=labels), 
    columns='name',               #entries to show as column headers
    values='value',               #entries to aggregate and show as cells
    aggfunc=numpy.sum,            #aggregation function(s)
)
    
print(grouped_pivot_table)
name   Carlos  Jane  Maria
param                     
1-10      NaN   NaN   38.0
11-20     NaN   NaN    3.0
21-30     NaN   2.0    NaN
31-40     8.0   NaN    NaN

是否为(right=False参数):

bins = range(0, date_data_frame["param"].max() // 10 * 10 + 20, 10)
labels = ['{}-{}'.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])]

grouped_pivot_table = pandas.pivot_table(
    date_data_frame,
    #grouped entries to show as row headers
    index= pd.cut(date_data_frame["param"], bins=bins, labels=labels, right=False), 
    columns='name',               #entries to show as column headers
    values='value',               #entries to aggregate and show as cells
    aggfunc=numpy.sum,            #aggregation function(s)
)
    
print(grouped_pivot_table)
name   Carlos  Jane  Maria
param                     
1-10      NaN   NaN   34.0
11-20     NaN   NaN    7.0
21-30     NaN   2.0    NaN
31-40     8.0   NaN    NaN