对保留所有值的数据进行分类
Categorize data preserving all values
我有一大组数据,通常是形状 > (700000, 5)
,我想对其执行多参数回归。所有变量都相互依赖。因此,要从多参数回归开始,我需要将数据分成离散间隔的子组,我可以在这些子组上执行单参数回归以获得第一个 "feeling" 的依赖关系。
目前我使用 pandas
的 pd.cut
和 df.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
我有一大组数据,通常是形状 > (700000, 5)
,我想对其执行多参数回归。所有变量都相互依赖。因此,要从多参数回归开始,我需要将数据分成离散间隔的子组,我可以在这些子组上执行单参数回归以获得第一个 "feeling" 的依赖关系。
目前我使用 pandas
的 pd.cut
和 df.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