我有大量数据,通常是形状为> (700000, 5)
的数据,我想在该数据上执行多参数回归。所有变量都相互依赖。因此,从多参数回归开始,我需要将数据分为离散区间的子组,在这些子组上可以执行单参数回归,以获得第一个“感觉”依赖性。
当前,我使用pd.cut
的{{1}}和df.groupby
方法,到目前为止,如果我想计算均值,总和或任何分类数据,它们的效果都很好。我当前的代码如下所示:
pandas
这将产生带有# 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
...
来进行分组方式,而是要返回组的所有值。
由于这需要(至少我想是这样),因此需要在MultiIndex中为数据提供一个新级别,因此我试图在groupby中向.mean()
添加另一个级别,但是我无法使其以任何有用的方式(和可表示的)工作) 办法。
我希望数据看起来像什么:
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
应该为这些点编号。如果每个组只有一个(或没有)数据点,则some_int_idx
应该是some_int_idx
。除了使用整数索引,还可以使用时间索引。
我该怎么做?预先感谢!
答案 0 :(得分:0)
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
对象的nth()
方法可以访问由DataFrameGroupBy
获得的组的元素。因此,您可以访问所有组元素,并使用以下命令将其作为完整数据框获取:
# 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上提交错误报告并发布链接。
bug report