分类保存所有值的数据

时间:2018-12-07 10:29:57

标签: python pandas pandas-groupby categorical-data

我有大量数据,通常是形状为> (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。除了使用整数索引,还可以使用时间索引。

我该怎么做?预先感谢!

1 个答案:

答案 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