对保留所有值的数据进行分类

Categorize data preserving all values

我有一大组数据,通常是形状 > (700000, 5),我想对其执行多参数回归。所有变量都相互依赖。因此,要从多参数回归开始,我需要将数据分成离散间隔的子组,我可以在这些子组上执行单参数回归以获得第一个 "feeling" 的依赖关系。

目前我使用 pandaspd.cutdf.groupby 方法,如果我想计算分类数据的均值、总和或其他任何东西,到目前为止效果很好。我当前的代码显示在这里:

# create sample dataframe
df = pd.DataFrame({'temp_a': np.random.rand(50) * 50 + 20,
                   'temp_b': np.random.rand(50) * 30 + 40,
                   'power_deg': np.random.rand(50),
                   'eta': 1 - np.random.rand(50) / 5},
                  index=pd.date_range(start='20181201', freq='T', periods=50))
# groupby by categorical data:
df_grpd = df.groupby(
    [pd.cut(df.temp_a, np.arange(0, 100, 5)),  # categorical for temp_a
     pd.cut(df.temp_b, np.arange(0, 100, 5)),   # categorical for temp_b
     pd.cut(df.power_deg, np.arange(0, 1, 1 / 20))  # categorical for power_deg
    ]).mean()  # groupby method. THIS is what I do NOT want!
# drop nan
df_grpd = df_grpd[~df_grpd.isna().any(axis=1)]

这会导致数据 MultiIndex 如:

                                  temp_a    ...          eta
temp_a   temp_b   power_deg                 ...             
...
(35, 40] (40, 45] (0.0, 0.05]  35.086985    ...     0.956543
         (45, 50] (0.5, 0.55]  35.204899    ...     0.866111
                  (0.85, 0.9]  37.018165    ...     0.841505
         (50, 55] (0.9, 0.95]  36.087333    ...     0.978163
(40, 45] (45, 50] (0.15, 0.2]  44.235000    ...     0.906970
...

现在我得到了每组值的均值,但我想保留每组的数据。因此,我希望返回组的所有值,而不是对 groupby 使用 .mean()
由于这需要(至少我猜是这样)数据的 MultiIndex 中的一个新级别,我尝试在 groupby 中向 by=[...] 添加另一个级别,但我无法使其在任何有用的(和可呈现的)中工作) 方法。 我希望数据看起来像:

                                            temp_a       ...          eta
temp_a   temp_b   power_deg    some_int_idx              ...             
...
(35, 40] (40, 45] (0.0, 0.05]  1            37.122355    ...     0.851477
                               2            33.455505    ...     0.980045
         (45, 50] (0.5, 0.55]  1            35.204899    ...     0.866111
                  (0.85, 0.9]  1            37.018165    ...     0.841505
                               2            39.998021    ...     0.800158
         (50, 55] (0.9, 0.95]  1            36.087333    ...     0.978163
(40, 45] (45, 50] (0.15, 0.2]  1            44.235000    ...     0.906970
...

总结

我想要按整数索引 some_int_idx 列出组的数据。如果每组有多个数据点(因为我的实际数据有很多数据点,"main" 组中会有几千个数据点),some_int_idx 应该对这些点进行编号。如果每组只有一个(或 none)个数据点,则 some_int_idx 应该是 1。不使用整数索引,使用时间索引也可以。

我该怎么做?提前致谢!

新的更好的答案,由 jorisvandenbossche(谢谢!)在提交错误报告时提供: 我可以简单地设置所需间隔的索引。我想有时候只是认为直接和简单的方法最有效...

df_grpd = df.set_index([pd.cut(df.temp_a, np.arange(0, 100, 5)),  # categorical for temp_a
     pd.cut(df.temp_b, np.arange(0, 100, 5)),   # categorical for temp_b
     pd.cut(df.power_deg, np.arange(0, 1, 1 / 20))  # categorical for power_deg
    ]).sort_index(axis=0)

旧解决方案:

(好的,经过大量测试我找到了答案。你通过 groupby 得到的组的元素可以通过 DataFrameGroupBy 对象的 nth() 方法访问。所以您可以访问所有组元素并将它们作为完整数据框获取:

# groupby by categorical data, WITHOUT MEAN (or any other grouping method):
df_grpd = df.groupby(
    [pd.cut(df.temp_a, np.arange(0, 100, 5)),  # categorical for temp_a
     pd.cut(df.temp_b, np.arange(0, 100, 5)),   # categorical for temp_b
     pd.cut(df.power_deg, np.arange(0, 1, 1 / 20))  # categorical for power_deg
    ])  # groupby method. Do NOT use this!

df_grpd_full = df_grpd.nth([range(df.shape[0])])

最后一行当然也可以重写为:

n_grps = 0
while not df_grpd.nth(n_grps).empty:
    n_grps += 1

df_grpd_full = df_grpd.nth([range(n_grps)])

)

可能的错误?

但奇怪的是,从第二组开始(df_grpd.nth(1)),分组方法似乎有问题。只有第一个 groupby 参数,在本例中 temp_a 似乎没问题。其他参数似乎超出了分组区间。我将在 github 和 post 和 link 上提交错误报告。 bug report